谁能解释为什么以下代码无法编译?至少在g ++ 4.2.4上.
更有趣的是,为什么它会在我将MEMBER转换为int时进行编译?
#include <vector>
class Foo {
public:
static const int MEMBER = 1;
};
int main(){
vector<int> v;
v.push_back( Foo::MEMBER ); // undefined reference to `Foo::MEMBER'
v.push_back( (int) Foo::MEMBER ); // OK
return 0;
}
Run Code Online (Sandbox Code Playgroud) 给出以下代码:
struct A { static constexpr int a[3] = {1,2,3}; };
int main () {
int a = A::a[0];
int b [A::a[1]];
}
Run Code Online (Sandbox Code Playgroud)
是A::a必然使用的ODR的int a = A::a[0]?
注意:这个问题代表了休息室辩论的一个不那么闷热/不合逻辑/无穷无尽的版本.
跟进这个问题有一个constexpr静态字符串会给出一个链接器错误
在这个问题中,这段代码无法编译:
#include <iostream>
struct Test { static constexpr char text[] = "Text"; };
int main()
{
std::cout << Test::text << std::endl; // error: undefined reference to `Test::text'
}
Run Code Online (Sandbox Code Playgroud)
从评论中,这段代码能够编译:
#include <iostream>
struct Test { static constexpr auto text = "Text"; };
int main()
{
std::cout << Test::text << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么auto版本可以工作,但版本的数组char没有?
能不能指出标准中的声明允许第二个版本而不允许第一个版本?
我看了一下constexpr静态成员变量的奇怪行为,但它似乎是另一个问题.