【问题标题】:How to define static const member?如何定义静态常量成员?
【发布时间】:2012-05-31 13:16:38
【问题描述】:

我的 Test 类有一个子类型的 const static 成员。我通常将这个conststatic成员定义如下。

class Test 
{
public:
    class Dummy {};

private:
    static Dummy const dummy;

};

Test::Dummy const Test::dummy;             // ERROR HERE

int main() 
{
    return 0;
}

当用 gcc-4.6 编译这个源码时,它没有报错并且编译正确。

当使用 gcc-4.4 编译相同的源代码时,会出现以下错误: error: uninitialized const ‘Test::dummy’ 在标记线上。

  • 还有其他方法来定义这个静态 const 成员变量吗?
  • 这是 gcc-4.4 的限制吗?
  • 有解决方法吗?

【问题讨论】:

  • Test::Dummy const Test::dummy = Test::Dummy();

标签: c++ g++ constants static-members


【解决方案1】:

说:

Test::Dummy const Test::dummy = { };

【讨论】:

  • 只要 Test::Dummy 是聚合 (C++03) 或始终在 C++11 中,就应该工作。
【解决方案2】:

http://gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const(给出了标准的相关参考)和GCC 4.6 release notes,它说

在 4.6.0 和 4.6.1 中,G++ 不再允许默认初始化 const 限定类型的对象,除非该类型具有用户声明的默认构造函数。在 4.6.2 G++ 实现了 DR 253 的建议解决方案,因此如果它初始化所有子对象,则允许默认初始化。可以通过提供初始化程序来修复无法编译的代码,例如

struct A { A(); };
struct B : A { int i; };
const B b = B();

使用 -fpermissive 来允许旧的、不合规的行为。

【讨论】:

    【解决方案3】:

    你也可以给class Dummy添加一个默认的ctor:

    class Dummy { public: Dummy(){} };
    

    在第 4 行。

    编辑: gcc 4.4 似乎无法为类Dummy 生成默认ctor。因此,上面直接克服了这个编译器错误。

    【讨论】:

    • 不需要,Dummy 有一个编译器合成的默认构造函数。
    • @juanchopanza 好吧,在 gcc 4.3.2 下,上面解决了问题没有对原始代码进行任何其他更改
    • @juanchopanza 确实是一个编译器错误:gcc 4.3.2(和 4.4)无法生成默认 ctor。但这意味着添加默认 ctor确实解决了问题的核心!
    • GCC 确实 not 无法生成默认构造函数,标准不允许在那里使用它,请参阅gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const
    • @Jonathan Wakely 这是否意味着 juanchopanza 上面的第一条评论完全错误?
    【解决方案4】:

    使用 gcc 4.4,使用

    Test::Dummy const Test::dummy = Test::Dummy;
    

    使用支持 C++11 的编译器,您可以使用统一的初始化语法:

    Test::Dummy const Test::dummy = { };
    

    但我认为 gcc 4.4 不支持。

    【讨论】:

    • 您的第一个解决方案不适用于 gcc 4.3.2,但第二个解决方案(如 Kerrek SB)可以。
    • 第一个应该使用Test::Dummy() 而不是Test::Dummy。对于第二个,统一初始化语法将没有=,即Test::Dummy const Test::dummy{ };
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多