10

我有一个静态成员的类。这将使用同一类的私有静态函数进行初始化。在静态成员初始化期间访问私有静态函数

#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; 
} 

我的问题是:因为哪个规则是允许的?显然,评论部分不起作用,因为我不允许从课外访问私人功能。那么为什么启动期间私有静态成员的初始化是一个特殊情况? (并在旁注:这条规则的意图是什么?是否允许这个确切的情况?)

我知道其他机制来初始化静态成员(如这里:Initializing private static members)。但在我的情况下,该成员是const,所以据我所知,设定它的唯一方法是通过定义处的直接初始化。

回答

8

由于静态数据成员的初始化被认为是类的表征的一部分,即使静态数据成员是在名称空间范围(类定义之外)定义的。

从标准,$9.2.3.2/2 Static data members [class.static.data]

(重点煤矿)

在静态数据成员定义中的初始化表达式是同类([basic.scope的范围。类])。

[实施例:

class process { 
    static process* run_chain; 
    static process* running; 
}; 

process* process::running = get_main(); 
process* process::run_chain = running; 

process类的run_chain在全球范围 定义的静态数据成员;符号process::run_chain指定成员 run_chain是类process的成员并且在类 process的范围内。在静态数据成员定义中,初始化程序 表达式引用类process的静态数据成员running。 - end example]

+1

你是对的const。编辑了这个问题。谢谢。 –

+1

我认为这会更清楚,因为“尽管静态数据成员是在名称空间范围(类定义之外)定义的,静态数据成员的初始化被认为是类的表征的一部分”。 (我使用“特征描述”,因为“类定义”在C++标准中有非常正式的含义。) –

+0

@MartinBonner好。 – songyuanyao