【发布时间】:2014-08-05 22:13:46
【问题描述】:
考虑这段代码:
class shy {
private:
int dont_touch; // Private member
public:
static const shy object;
};
const shy shy::object = []{
shy obj;
obj.dont_touch = 42; // Accessing a private member; compiles; WHY?
return obj;
}();
int main()
{
}
这对我来说似乎真的很不直观。 C++11/14 标准对此有何评论?这是 GCC/Clang 错误吗?
【问题讨论】:
-
为什么这违反直觉...
shy::object的初始化表达式在类封装中,不是吗? -
可能是 3.4.1/13:用于定义
class X(9.4.2) 的static数据成员的名称(在 qualified-id 之后static成员的名称)被查找,就好像该名称在X的成员函数中使用一样。 -
考虑经典的 Meyers 单例由私有 ctor 初始化;这基本相同。
-
@TonyD 名称查找!= 可访问性
-
可能是 9.4.2/2 “静态数据成员定义中的初始化表达式在其类 (3.3.7) 的范围内。” (乍一看,这似乎没什么新意)那段中的例子似乎同意。但更好的是关于静态数据成员的初始化程序可以访问什么的明确答案。
标签: c++ gcc c++11 lambda clang