我对静态类/结构成员声明/初始化感到有点困惑。
我确信它必须在类/结构体内声明一个静态成员并在外部初始化它。除了一个重要的例外:如果成员(a)是const并且(b)是整数类型({{1},它可以声明和初始化类/结构体内的静态成员},bool
,int
等。)
所以(我确信)它完全合法,比如
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:抱歉我的英语不好。