iam*_*ind 13 c++ static-members local-class
void foo (int x)
{
struct A { static const int d = 0; }; // error
}
Run Code Online (Sandbox Code Playgroud)
除了标准的参考,这背后是否有任何动机禁止static内部阶级的领域?
error: field `foo(int)::A::d' in local class cannot be static
Run Code Online (Sandbox Code Playgroud)
编辑:但是,static允许成员函数.对于这种情况,我有一个用例.假设我只想foo()为POD调用,那么我可以实现它,就像
template<typename T>
void foo (T x)
{
struct A { static const T d = 0; }; // many compilers allow double, float etc.
}
Run Code Online (Sandbox Code Playgroud)
foo()应该只传递POD(如果static允许)而不传递给其他数据类型.这只是我脑海中的一个用例.
我猜这是因为必须在全局范围内定义静态类成员。
编辑:
对不起,我是个懒鬼,只是把东西扔了:) 更准确一点。类的静态成员需要在全局范围内定义,例如
foo.h
class A {
static int dude;
};
Run Code Online (Sandbox Code Playgroud)
文件
int A::dude = 314;
Run Code Online (Sandbox Code Playgroud)
现在,由于 void foo(int x) 内的作用域不是全局的,因此没有定义静态成员的作用域。希望这更清楚一点。
Magnus Skog给出了真正的答案:静态数据成员只是一个声明; 该对象必须在命名空间范围内的其他地方定义,并且类定义在命名空间范围内不可见.
请注意,此限制仅适用于静态数据成员.这意味着有一个简单的解决方法:
class Local
{
static int& static_i()
{
static int value;
return value;
}
};
Run Code Online (Sandbox Code Playgroud)
这为您提供了完全相同的功能,但代价是使用函数语法来访问它.