C++ 对静态成员的常量引用

C++ 对静态成员的常量引用,c++,c++11,reference,static,member,C++,C++11,Reference,Static,Member,我得到错误:main.cpp | 11 |对'Foo::n'的未定义引用。为什么?您使用的编译器版本是什么?看起来,它在C++11方言方面存在一些问题(ideone.com编译成功率为100%) 也许,试试这个是个好主意 struct Foo { constexpr static int n = 10; }; void f(const int &x) {} int main() { Foo foo; f(Foo::n); return 0; } 编译

我得到错误:main.cpp | 11 |对'Foo::n'的未定义引用。为什么?

您使用的编译器版本是什么?看起来,它在C++11方言方面存在一些问题(ideone.com编译成功率为100%)

也许,试试这个是个好主意

struct Foo
{
    constexpr static int n = 10;
};

void f(const int &x) {}

int main()
{
    Foo foo;
    f(Foo::n);
    return 0;
}

编译器错误是标准要求的。因为你的职能

struct Foo
{
    static int n;
};
int Foo::n = 10;
在调用中通过引用获取它的参数

void f(const int& x)
变量
Foo::n
使用odr。因此,需要定义

有两种解决方案

1定义
Foo::n

f(Foo::n);
2按值取
f
的参数:

struct Foo    
{   
    constexpr static int n = 10; // only a declaration    
};    

constexpr int Foo::n; // definition

我使用的是MingWGCC4.7.3。我将把编译器更新到最新版本(4.8.1)并报告结果。谢谢。这似乎是GCC4.8中的一个错误。据我所知,OP的代码不应该编译,MWid的回答说明了原因。@KonradRudolph从技术上讲,这段代码可以编译,但不能链接。对于未定义的静态数据成员的odr使用,标准明确规定“无需诊断”(见§9.4.2/4)。@MWid Ah是的,当然-这显然是有意义的,因为编译器无法诊断。但是当我说“compile”时,我实际上是指整个过程,包括链接。@Yivo为什么我们需要传递静态成员作为引用?仅当类和自由函数在不同的作用域中并且我们对它们进行操作时,它是否有用?或者它在其他方面有用吗?第三种解决方案,如果Foo是一个模板类,并且您不能更改
f
:使用
f(+Foo::n)
void f(int x);