g++
với -std=c++11
dường như chấp nhận nó:Tại sao không có chuyển đổi thu hẹp trong mã này, dẫn đến lỗi?
#include <vector>
#include <initializer_list>
std::vector<float> vf={1,2,3}; // Isn't this narrowing (i.e., an error)?
int main() {}
Có vẻ như rằng phù hợp với những nhận xét nên lôi ra, nhưng nó không.
Cập nhật
Nhờ Jesse cho trỏ đến các standardese (8.5.4 p7) định nghĩa tại sao điều này là OK. Dưới đây là một số mẫu mã giúp làm rõ các hành vi được xác định theo tiêu chuẩn:
const int v5=5;
int v6=6;
vector<double> vd1={1,2,3,4}; // OK
vector<double> vd2={1,2,3,4,v5}; // Still OK, v5 is const
vector<double> vd3={1,2,3,4,v5,v6}; // Error, narrowing conversion, because v6
// is non-const
vector<double> vd4={1,2,3,4,v5,static_cast<const int>(v6)}; // Also errors on
// gcc 4.7.2, not sure why.
Tôi hy vọng rằng các ví dụ tôi vừa trình bày sẽ giúp đỡ người khác vượt qua một số vấn đề thu hẹp khi sử dụng danh sách khởi tạo.
Nếu có ai biết lý do trường hợp cuối cùng vi phạm định nghĩa chuẩn, vui lòng đăng nhận xét.
Tại sao bạn nghĩ rằng nó thu hẹp? –
Thu hẹp sẽ từ 'float' sang' int' –
Chuyển đổi đó thu hẹp như thế nào? GCC thực hiện [cảnh báo] (http://liveworkspace.org/code/1FWK1L$2) khi thu hẹp được phát hiện và bạn có thể biến lỗi đó thành lỗi bằng cách [biên dịch với '-porm-error'] (http: // liveworkspace.org/code/1FWK1L$1). – Praetorian