§5.19/3 в С++ 14 определяет интегральное постоянное выражение и преобразованное константное выражение:
Интегральное постоянное выражение представляет собой выражение интегрального или неперечисленный тип перечисления, неявно преобразованный в prvalue, где преобразованное выражение является выражением постоянной константы. [Примечание: такие выражения могут использоваться как границы массива (8.3.4, 5.3.4), так как бит-поле длины (9.6), в качестве инициализаторов перечислителя, если базовый тип не фиксированы (7.2) и как выравнивания (7.6.2). -end note] Преобразованная постоянное выражение типа
T
является выражением, неявно преобразуется в prvalue типаT
, где преобразованное выражение основное константное выражение и неявная последовательность преобразования содержит только пользовательские преобразования, преобразования lvalue-to-rvalue (4.1), интегральные продвижения (4.5) и интегральные преобразования (4.7) чем сужение конверсий (8.5.4). [Примечание: такие выражения могут быть используется в выраженияхnew
(5.3.4), как выраженияcase
(6.4.2), так как инициализаторы перечислителя, если базовый тип фиксирован (7.2), так как массива (8.3.4) и в качестве интегрального или перечисляемого шаблона непигового типа аргументы (14.3). -end note]
Возможно, мне что-то не хватает, но первое впечатление, что каждое интегральное постоянное выражение является преобразованным постоянным выражением.
Изменить
И я также считаю, что в этом абзаце есть ошибка:
Вместо:
A converted constant expression of type T is an expression, implicitly converted to a prvalue of type T, ...
это должно быть:
A converted constant expression of type T is an expression, implicitly converted to a prvalue of an integral type, ...
И это изменение позволяет компилировать следующий код:
#include <iostream>
struct A { operator int() { return 5; } } a;
int main() {
int b[a]{ 0, 1, 2, 3, 4 };
std::cout << b[4] << '\n';
}
где a
в объявлении int b[a]{ 0, 1, 2, 3, 4};
представляет собой преобразованное константное выражение типа a
, неявно преобразованное в prvalue интегрального типа (int
), где преобразованное выражение 5
является выражением постоянной константы, и неявная последовательность преобразования содержит только пользовательское преобразование.