我不确定这是编译器错误还是我误解了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),所以我真的对这个具体的例子很感兴趣。
答案 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
- 示例]