C ++ static constexpr字段,类型不完整

时间:2015-04-03 12:33:59

标签: c++ c++11

我试图编译此代码,但g ++抱怨ZERO类型不完整。这是否意味着在C ++中结构不能包含自身的static constexpr实例?如果是这样,为什么?

struct Cursor
{
    size_t row,column;

    static constexpr Cursor ZERO {0,0};
    //error: constexpr const Cursor Cursor::ZERO has incomplete type
};

编辑:我了解Cursor在声明ZERO时无法提供完整的类型。我想知道的是:我有什么方法ZERO属于Cursor且仍然是constexpr

3 个答案:

答案 0 :(得分:17)

不幸的是,你根本做不到这个!

某些static constexpr成员可以内联初始化:

  

[C++11 9.4.2/3]: [..] 可以使用static说明符在类定义中声明文字类型的constexpr数据成员;如果是这样,它的声明应指定一个大括号或等于初始化,其中作为赋值表达式的每个 initializer-clause 是一个不断表达。 [..]

Cursor是一个文字类型,因此这很重要。

使用Cursor本身作为static数据成员在其自己的类型中不是问题,只要在词法命名空间范围初始化它:

  

[C++11: 9.4.2/2]: 在其类定义中声明static数据成员不是定义,可能是不完整类型,而不是cv-qualified void。 static数据成员的定义应出现在包含成员类定义的命名空间范围内。在命名空间范围的定义中,static数据成员的名称应为使用::运算符通过其类名限定。 static数据成员定义中的初始值设定项表达式属于其类(3.3.7)。

但你不能用constexpr

来做到这一点
  

[C++11: 7.1.5/9]:对象声明中使用的constexpr说明符将对象声明为const。这样的对象应具有文字类型并应初始化。 [..]

我认为所有这些措辞都可以改进,但与此同时,我认为你必须让ZERO成为封闭命名空间中的非成员。

答案 1 :(得分:11)

  

有什么方法可以让ZERO属于Cursor但仍然是constexpr

是的,如果您将嵌套的子类计为“属于”包含的类:

struct Cursor
{
    size_t row,column;

    struct Constants;
};

struct Cursor::Constants
{
    static constexpr Cursor ZERO {0,0};
};

答案 2 :(得分:6)

如果您接受具有功能而非变量

,则可以
SSHException at /utility/status/
No authentication methods available
相关问题