gpt4 book ai didi

c++ - cv-qualified struct 的成员不是类似的 cv-qualified

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:49 29 4
gpt4 key购买 nike

根据这个answer ,下面的代码应该没有错误地编译:

#include <type_traits>

namespace
{

struct A { int i; };

volatile A a{};
static_assert(std::is_volatile< decltype(a) >{});
static_assert(std::is_volatile< decltype(a.i) >{});

}

但是有一个硬错误:

main.cpp:10:1: error: static_assert failed
static_assert(std::is_volatile< decltype(a.i) >{});
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

Live example with clang 3.6.0 .

这是一个 clang bug 还是我遗漏了一些实质性的东西?

附加:

#include <type_traits>

namespace
{

struct A { int i; };

const A a{};
static_assert(std::is_const< decltype(a) >{});
static_assert(std::is_const< decltype(a.i) >{});

}

后一个代码片段的行为完全相同。

附加:

static_assert(std::is_volatile< std::remove_pointer_t< decltype(&a.i) > >{});

不会导致错误。

最佳答案

这是正确的行为;当前decltype不是在测试你认为它测试的东西。你必须改变你的 decltype如果你想测试 volatile -性。

可以复制一个值并删除 volatile -性。但是引用必须是 volatile reference-to-volatile。

int foo() {
int i = a.i; // volatile not needed
volatile int &i = a.i; // volatile needed
}

decltype正在 治疗 a.i作为右值,而不是左值, doing what decltype默认情况下会执行“天真”文本分析并报告 A::i 的类型如源代码中所写;因此,decltype(a.i)int .

()围绕 decltype 中的表达式改变它的行为(通常以好的方式,对于这种问题),在适当的时候给我们一个左值。因此,decltype(( a.i ))volatile int & .

现在,您可能期望 is_volatile< volatile int & >::value会是真的。但事实并非如此。我们需要先删除引用,然后才能测试 volatile -性。

static_assert(std::is_volatile< std::remove_reference_t<decltype((a.i))> >{});

最后,您可能会惊讶 volatile int &根据 is_volatile 不是易变的.但我想这是因为引用真的很像指针——引用中的“指针”不是易变的,即使指向的对象是易变的。无论如何,这就是我的理论。 const int&也不满足is_const .

关于c++ - cv-qualified struct 的成员不是类似的 cv-qualified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31742257/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com