在静态成员初始化期间访问私有静态函数

时间:2016-07-26 07:49:57

标签: c++ initialization language-lawyer static-methods static-members

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

#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,所以据我所知,设置它的唯一方法是在定义的地方通过直接初始化。

1 个答案:

答案 0 :(得分:8)

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

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

开始

(强调我的)

  

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

     

[例如:

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。在静态数据成员定义中,初始化程序   expression指的是类running的静态数据成员process。    - 结束例子]