`const int a = 1;` является `a` константным выражением, если` a` имеет автоматическую продолжительность хранения

N4527 5,20 [expr.const] p2

Условное выражение e является выражение основной константы если оценка е, следуя правилам
abstract machine (1.9), будет вычислять одно из следующих выражений:

(2.7) — преобразование lvalue в rvalue (4.1), если оно не применяется к

(2.7.1) — энергонезависимое glvalue целочисленного типа или типа перечисления, которое относится к полному энергонезависимому констату
объект с предшествующей инициализацией, инициализированный константным выражением, или

(2.7.2) — энергонезависимое glvalue, которое ссылается на подобъект строкового литерала (2.13.5), или

(2.7.3) — энергонезависимое glvalue, которое относится к энергонезависимому объекту, определенному с помощью constexpr, или которое ссылается на
к неизменяемому подобъекту такого объекта, или

(2.7.4) — энергонезависимое glvalue литерального типа, которое относится к энергонезависимому объекту, чье время жизни началось
в рамках оценки е;

5.20 [expr.const] р5

Постоянное выражение является либо основное выражение чье значение относится к сущности, которая является
допустимый результат константного выражения (как определено ниже) или основного значения константного выражения,
Значение — это объект, где для этого объекта и его подобъектов:

— каждый элемент нестатических данных ссылочного типа относится к объекту, который является разрешенным результатом константного выражения, и

— если объект или подобъект имеет тип указателя, он содержит адрес объекта со статической продолжительностью хранения, адрес после конца такого объекта (5.7), адрес функции или значение нулевого указателя.

Сущность является разрешенным результатом константного выражения, если это объект с статическая продолжительность хранения это либо не временный объект, либо временный объект, значение которого удовлетворяет вышеуказанным ограничениям, либо
функция.

void foo(){
const int a = 1;//a has automatic storage duration
int b[a]{};
}

В int b[a]{};, a это id-выражение, a является основным значением константы lvalue. Является a постоянное выражение?


Это разъяснение Является ли выражение с интегральной константой glvalue константным выражением?

2

Решение

a может быть выражением основной переменной prvalue, но не выражением основной константы glvalue, и при этом это не должно быть возможным. Вы уже нашли формулировку в стандарте, поэтому, возможно, лучше объяснить, почему правила такие, какие они есть.

void foo(){
const int a = 1;//a has automatic storage duration
static constexpr const int &ra = a;// cannot possibly be valid
}

Это не может быть действительным, потому что это потребовало бы адреса a быть известным раньше foo вызывается, прежде чем там является любой a,

Ваш int b[a]{}; хорошо, потому что он использует a в качестве основного значения постоянного выражения: это не важно, где a хранится, его просто волнует, какое значение он имеет.

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector