Sve*_*ann 10 c++ static-methods initialization static-members language-lawyer
我有一个静态成员的类.这将使用同一个类的私有静态函数进行初始化.
#include <iostream>
#include <string>
class A
{
public:
static std::string const s;
private:
static std::string make()
{
return "S";
}
};
std::string const A::s = A::make();
int main()
{
std::cout << A::s << std::endl;
// std::cout << A::make() << std::endl; // <-- Does not work
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:由于这个规则是允许的吗?很明显,评论的部分不起作用,因为我不允许从课外访问私人函数.那么为什么在启动期间私有静态成员的初始化是一个特殊情况呢?(并且在旁注:这条规则的目的是什么?是否允许这个确切的情况?)
我知道其他初始化静态成员的机制(如下所示:初始化私有静态成员).但在我的情况下,成员是const,所以据我所知,设置它的唯一方法是通过定义位置的直接初始化.
因为静态数据成员的初始化被认为是类的表征的一部分,即使静态数据成员是在命名空间范围内定义的(在类定义之外).
从标准的$ 9.2.3.2/2静态数据成员[class.static.data]:
(强调我的)
静态数据成员定义中的初始化表达式在其类([basic.scope.class])的范围内.
[例如:
Run Code Online (Sandbox Code Playgroud)class process { static process* run_chain; static process* running; }; process* process::running = get_main(); process* process::run_chain = running;静态数据成员
run_chain的类的process在全局范围内所定义; 表示法process::run_chain指定该成员run_chain是类的成员process并且在类的范围内process.在静态数据成员定义中,初始化表达式表示running类的静态数据成员process. - 结束例子]