【问题标题】:Access to private static function during static member initialization在静态成员初始化期间访问私有静态函数
【发布时间】:2016-11-29 18:05:52
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    来自标准,$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;
    

    process的静态数据成员run_chain在全局中定义 范围;符号 process::run_chain 指定成员 run_chainprocess 类的成员,并且在类的范围内 process。在静态数据成员定义中,初始化器 表达式引用类process 的静态数据成员running。 —结束示例]

    【讨论】:

    • 您对 const 的看法是正确的。编辑了问题。谢谢。
    • 我认为这会更清楚,因为“静态数据成员的初始化被认为是类特征的一部分,即使静态数据成员是在命名空间范围内定义的(在类定义之外)。 " (我使用“表征”是因为“类定义”在 C++ 标准中具有非常正式的含义。)
    • @MartinBonner Fine.
    猜你喜欢
    • 2014-03-31
    • 2012-07-22
    • 2012-07-16
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多