第一個代碼段編譯沒有任何警告(live example):爲什麼這些代碼片段的處理方式與GCC不同?
constexpr operator int() { return i; }
GCC警告b
是VLA:
#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
現在改變上面的片段。
對我而言,這兩個變體似乎都符合C++ 14中的§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