为什么未初始化的constexpr变量不是常数?

时间:2015-03-27 18:15:37

标签: c++ c++11 gcc constexpr

我不确定这是编译器错误还是我误解了constexpr:

struct S{};
constexpr S s1{};
constexpr S s2;

struct test{
    static constexpr auto t1 = s1;
    static constexpr auto t2 = s2;  //error here
};

GCC 4.8给我一个奇怪的错误“错误:字段初始化程序不是常数”。 s2真的不是常数吗?如果是这样的话?

为了清楚起见,我实际上在我的代码中使用了一堆空结构(对于元编程https://github.com/porkybrain/Kvasir),所以我真的对这个具体的例子很感兴趣。

1 个答案:

答案 0 :(得分:4)

更新:代码应该编译,因为[class.ctor]/5读取:

  

隐式定义的默认构造函数执行该类的初始化集合,该初始化集合将由该用户编写的默认构造函数执行,该类没有 ctor-initializer (12.6.2)和空复合语句。如果该用户编写的默认构造函数满足constexpr构造函数(7.1.5)的要求,则隐式定义的默认构造函数为constexpr

由于S只是一个空结构,因此隐式定义的默认构造函数为空,因此满足constexpr要求。

所以在这里你要处理编译器的不完善,你必须以某种方式解决这些问题。


旧答案:

Clang发出更明智的错误信息:

main.cpp:3:13: error: default initialization of an object of const type 'const S' 
requires a user-provided default constructor
constexpr S s2;
            ^

[dcl.constexpr] / 9提供了解释,甚至几乎完全是您的代码示例:

  

对象声明中使用的constexpr说明符将对象声明为const。这样的对象应该有   字面类型并应初始化。(...)   [示例:

struct pixel {
    int x, y;
};
constexpr pixel ur = { 1294, 1024 };// OK
constexpr pixel origin; // error: initializer missing
  

- 示例]