【发布时间】:2014-05-14 06:47:26
【问题描述】:
struct A {
int a = 0;
constexpr A() { a = 1; }
};
constexpr bool f() {
constexpr A a;
static_assert(a.a == 1, ""); // L1: OK
return a.a == 1;
}
static_assert(f(), ""); // L2: Error, can not modify A::a in constexpr
- 在线编译器 URL:http://goo.gl/jni6Em
- 编译器:clang 3.4(使用 -std=c++1y)
- 系统:Linux 3.2
如果我删除 L2,此代码将编译。如果我添加 L2,编译器会抱怨“在常量表达式中不允许修改 const 限定类型 'const int' 的对象”。我不是语言律师,所以我不确定这是否属实。但是,如果是,为什么编译器没有抱怨 L1,因为它也将 A() 称为 constexpr?这是clang的错误吗?还是我错过了什么?
参考:http://en.cppreference.com/w/cpp/language/constexpr
顺便说一句,如果我更改“constexpr A a;”到“一个;” (删除 constexpr 关键字),L1 编译失败,这是预期的。但是,编译器不再抱怨 L2。
在线编译器网址:http://goo.gl/AoTzYx
【问题讨论】: