我试图编译此代码,但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
?
答案 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