Đoạn đầu tiên biên dịch mà không cần bất kỳ cảnh báo (live example):Tại sao các đoạn mã này được GCC xử lý khác nhau?
#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';
}
Bây giờ thay đổi đoạn trên bằng cách quay i
trong các nhà điều hành chuyển đổi (live example):
constexpr operator int() { return i; }
GCC cảnh báo rằng b
là một VLA .
Với tôi, cả hai biến thể có vẻ phù hợp với đoạn §5.19 [expr.const]/3 trong C++ 14.
Tại sao 'a' phải trải qua một chuyển đổi từ rvalue sang rvalue trong trường hợp này? Tôi hỏi điều này, bởi vì định nghĩa của một 'biểu thức hằng số được chuyển đổi' trong §5.19/3 (N4140) dường như không đòi hỏi sự chuyển đổi từ' a' trong khai báo 'int b [a] {0, 1 , 2, 3, 4}; '. – Ayrosa
@Ayrosa Vâng, 'a' không bao giờ phải trải qua một, nhưng toán tử chuyển đổi của nó phải được gọi để chuyển nó thành' std :: size_t'. ('a' là một biểu thức hằng số được chuyển đổi kiểu' std :: size_t' bên trong dấu ngoặc đơn) – Columbo
Tôi mất một lúc để nắm bắt những gì bạn nói và đánh dấu trong câu trả lời của bạn.Chắc chắn, nó không phải là một nhiệm vụ dễ dàng cho một, để hiểu đầy đủ các tiêu chuẩn. Câu trả lời hay (+1). – Ayrosa