N4527 5.20 [expr.const] p5
Постоянное выражение представляет собой либо выражение константы ядра glvalue, значение которого относится к объекту, который является разрешенный результат постоянного выражения (как определено ниже) или выражение постоянной константы prvalue, чье value - это объект, где для этого объекта и его подобъектов:
- каждый нестатический элемент данных ссылочного типа относится к объекту, который является допустимым результатом постоянного выражения, и
- если объект или подобъект имеет тип указателя, он содержит адрес объекта со статической продолжительностью хранения, адрес после конца такого объекта (5.7), адрес функции или значение нулевого указателя.
Сущность является допустимым результатом постоянного выражения, если это объект со статической продолжительностью хранения, который либо не является временным объектом, либо является временным объектом, значение которого удовлетворяет вышеуказанным ограничениям, либо оно является функция.
void foo(){
int a = 1;
int b[a || 1]{};//ok in gcc 5.1.0, error in clang 3.8.0
static_assert(a || 1,"");//ok in gcc 5.1.0, error in clang 3.8.0
switch(1){
case a || 1://ok in gcc 5.1.0, error in clang 3.8.0
;
}
}
Является a || 1
a константным выражением?
N4527 5.20 [expr.const] p2
Условное выражение e является выражением постоянной константы, если оценка e, следуя правилам абстрактная машина (1.9), оценила бы одно из следующих выражений:
(2.7) - преобразование lvalue-to-rvalue (4.1), если оно не применяется к
(2.7.1) - нелетучее значение целочисленного или перечисляемого типа, которое относится к полной нелетучей константе объект с предшествующей инициализацией, инициализированный константным выражением, или
(2.7.2) - нелетучее значение glvalue, которое относится к подобъекту строкового литерала (2.13.5) или
(2.7.3) - нелетучее значение glvalue, которое относится к энергонезависимому объекту, определенному с помощью constexpr, или к которому относится к не изменяемому под-объекту такого объекта, или
(2.7.4) - нелетучий glvalue буквального типа, который относится к энергонезависимому объекту, срок службы которого начался в рамках оценки e;
Является a || 1
a выражением константы ядра?