birinci pasajı herhangi bir uyarı olmaksızın (live example) derler:Bu snippet'ler neden GCC'ye göre farklı şekilde işleniyor?
constexpr operator int() { return i; }
GCC b
bir VLA olduğunu uyarır:
#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';
}
, dönüşüm operatörü (live example) içerisinde i
döndürerek yukarıdaki parçacık değiştirebilir .
, her iki varyant C++ 14'de paragrafta §5.19 [expr.const]/3'e uygun görünmektedir.
Bu durumda neden bir “aval değerden dönüştürme” yapılmalı? Bunu soruyorum çünkü §1.19/3 (N4140) 'da “dönüştürülmüş bir sabit ifade” nin tanımı, “a” ifadesinden “a” dan b'ye [a] {0, 1) ihtiyaç duymuyor gibi görünmektedir. , 2, 3, 4}; '. – Ayrosa
@Ayrosa Eh, 'asla bir tane geçmek zorunda kalmaz, ancak 'std :: size_t' değerine dönüştürmek için dönüşüm operatörünün çağrılması gerekir. Gerçekten dediğin ve Cevabınız vurgulanan neyi kavramak biraz zaman aldı – Columbo
('a' parantez içindeki tipi' std :: size_t' bir dönüştürülen sabit ifadesidir).Kesinlikle, standardı tam olarak anlamak, bir tanesi için kolay bir iş değildir. Harika cevap (+1). – Ayrosa