提问人:mic 提问时间:11/5/2016 最后编辑:Morwennmic 更新时间:11/6/2016 访问量:364
嵌套枚举与 constexpr 静态成员变量
nested enum vs constexpr static member variable
问:
当引入 C++ 时,我开始将编译时常量编写为成员变量,而不是使用 hack。constexpr
constexpr static
enum
所以我知道一个微妙的区别,即你不能接受用 定义的常量的地址,在这种情况下你可以。既然你不想那样做,那就没关系了。但是现在我偶然发现了一些代码,我不确定您是否会不小心获取地址。enum
constexpr
#include <iostream>
struct A
{
constexpr static unsigned c1 = 1;
enum{ c2 = 2 };
};
template<typename T>
auto foo(T&& p)
{
return p;
}
int main()
{
std::cout << foo(A::c1) << " " << foo(A::c2) << std::endl;
return 0;
}
gcc 7
并且会很好地编译此代码,其中这些编译器的任何旧版本都会抱怨未定义的引用。clang 4
A::c1
如果我理解正确,该函数将表达式作为某种引用,因此需要获取其地址,这会导致未定义的引用。foo
A::c1
什么是正确的行为? 该标准是否要求我定义成员变量,以便能够在完美转发的上下文中使用它们?
编辑:我刚刚注意到,如果您使用而不是 .那么标准有没有相关的变化呢?gcc 7
clang 4
-std=c++14
-std=c++1z
答: 暂无答案
评论