最初の断片は、任意の警告(live example)なしでコンパイル:これらのスニペットはGCCによって異なって扱われるのはなぜですか?
#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';
}
今変換演算子(live example)でi
を返すことによって、上記のコードを変更:
constexpr operator int() { return i; }
GCCはb
がVLAあることを警告します。
私にとって、両方の変種は、C++の段落§5.19[expr.const]/3に準拠しているようです。
この場合、 'a'は左辺値と右辺値の変換を行わなければならないのはなぜですか?これは、§5.19/ 3(N4140)の ''変換定数式 'の定義が宣言 'int b [a] {0,1 、2,3,4}; – Ayrosa
@Ayrosaさて、 'a'は一度も実行する必要はありませんが、' std :: size_t'に変換するためには変換演算子を呼び出す必要があります。 ( 'a'は角括弧の中に' std :: size_t'型の定数式を変換したものです) – Columbo
あなたの答えで強調したことを本当に理解するのに時間がかかりました。間違いなく、スタンダードを完全に理解することは容易なことではありません。素晴らしい答え(+1)。 – Ayrosa