Der erste Schnipsel kompiliert ohne Warnungen (live example):Warum werden diese Snippets von GCC anders behandelt?
constexpr operator int() { return i; }
GCC warnt, dass b
a VLA ist:
#include <iostream>
struct A {
constexpr A(): i(5){}
constexpr operator int() { return 5; }
int i;
};
int main() {
A a;
int b[a]{ 0, 1, 2, 3, 4 };
std::cout << b[4] << '\n';
}
nun durch Rücksendung i
in dem Umwandlungsoperator (live example) Die oben Schnipsel verändern .
Für mich scheinen beide Varianten dem Absatz §5.19 [expr.const]/3 in C++ 14 zu entsprechen.
Warum muss 'a' in diesem Fall eine Lvalue-to-rvalue-Konvertierung durchlaufen? Ich frage das, weil die Definition eines "konvertierten konstanten Ausdrucks" in §5.19/3 (N4140) anscheinend keine solche Umwandlung von "a" in der Deklaration "int b [a] {0, 1" erfordert , 2, 3, 4}; '. – Ayrosa
@Ayrosa Nun, 'a' muss sich nie einem unterziehen, aber der Konvertierungsoperator muss aufgerufen werden, um ihn in' std :: size_t' umzuwandeln. ('a' ist ein konvertierter konstanter Ausdruck vom Typ' std :: size_t' innerhalb der Klammern) – Columbo
Es hat eine Weile gedauert, bis ich wirklich begriff, was Sie in Ihrer Antwort gesagt und hervorgehoben haben.Auf jeden Fall ist es keine leichte Aufgabe, den Standard vollständig zu verstehen. Große Antwort (+1). – Ayrosa