嵌套枚举与 constexpr 静态成员变量

nested enum vs constexpr static member variable

提问人:mic 提问时间:11/5/2016 最后编辑:Morwennmic 更新时间:11/6/2016 访问量:364

问:

当引入 C++ 时,我开始将编译时常量编写为成员变量,而不是使用 hack。constexprconstexpr staticenum

所以我知道一个微妙的区别,即你不能接受用 定义的常量的地址,在这种情况下你可以。既然你不想那样做,那就没关系了。但是现在我偶然发现了一些代码,我不确定您是否会不小心获取地址。enumconstexpr

#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 4A::c1

如果我理解正确,该函数将表达式作为某种引用,因此需要获取其地址,这会导致未定义的引用。fooA::c1

什么是正确的行为? 该标准是否要求我定义成员变量,以便能够在完美转发的上下文中使用它们?

编辑:我刚刚注意到,如果您使用而不是 .那么标准有没有相关的变化呢?gcc 7clang 4-std=c++14-std=c++1z

C++ 枚举 constexpr undefined-reference C++17

评论

0赞 m.s. 11/5/2016
类静态 constexpr 的 C++ 链接器错误可能重复
0赞 krzaq 11/5/2016
@m.s.自C++11以来,可能已经发生了很大变化,因为这个问题被标记了。
2赞 Some programmer dude 11/5/2016
请参阅有关内联成员变量定义的答案。
0赞 mic 11/6/2016
@m.s.我会说您链接的答案没有回答我的问题,因为我不是在要求修复。我的问题是,该标准是否真的要求我在单独的编译单元中定义这些成员,以便能够在完美转发的上下文中使用它。但是一些程序员家伙的链接提供了一些见解。
0赞 T.C. 11/6/2016
是的,引用绑定意味着 odr-use,任何 odr 使用的东西都需要有一个定义。

答: 暂无答案