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 int'». Я не языковой юрист, поэтому не уверен, что это правда. Однако, если это так, почему компилятор ничего не жаловался на L1, поскольку он также вызывал A () как constexpr? Это баг лязга? Или я что-то пропустил?
Ссылка: http://en.cppreference.com/w/cpp/language/constexpr а>
Кстати, если я изменю "constexpr A a;" к "A a;" (удалить ключевое слово constexpr), L1 не удалось скомпилировать, что ожидалось. Однако компилятор больше не жаловался на L2.
URL-адрес онлайн-компилятора об этом: http://goo.gl/AoTzYx