静态const积分成员声明的问题

时间:2016-04-27 18:35:07

标签: c++ initialization const static-members

我对静态类/结构成员声明/初始化感到有点困惑。

我确信它必须在类/结构体内声明一个静态成员并在外部初始化它。除了一个重要的例外:如果成员(a)是const并且(b)是整数类型({{1},它可以声明初始化类/结构体内的静态成员},boolint等。)

所以(我确信)它完全合法,比如

long

它可以工作,在下面的例子中

struct foo
 { static const int i = 123; };

但是,如果我更改#include <iostream> struct foo { static const int i = 123; void baz (const int j) { std::cout << "baz: j = " << j << '\n'; } void bar () { baz(foo::i); } }; int main () { foo().bar(); return 0; } 方法的定义,将参数foo::baz()作为参考

j

我发现 void baz (const int & j) { std::cout << "baz: j = " << j << '\n'; } 未定义。这与foo::i(4.9.2),g++(3.5.0),编译为c ++ 98,c ++ 11或c ++ 14。在所有情况下,我都会收到以下链接器错误:clang++(意大利语为&#34;未定义引用\&#34; riferimento non definito a "foo::i" \&#34;&#34;)。

如果我只声明

中的静态成员
foo::i

并在结构体外部初始化它,

   //static const int i = 123;
   static const int i;

没有更多错误,程序按预期工作。

那么......为什么?

是我(我不理解静态成员初始化?)或者是编译器(const int foo::i = 123; g++的错误?)?

p.s:抱歉我的英语不好。

0 个答案:

没有答案