2013-03-08 32 views
5

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.

+0

Tại sao bạn nghĩ rằng nó thu hẹp? –

+3

Thu hẹp sẽ từ 'float' sang' int' –

+0

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

Trả lời

10

Các quy định là trong 8.5.4 p7 mà không bao gồm các ví dụ của bạn

từ một loại nguyên hoặc kiểu enumeration unscoped đến một dấu chấm động loại, trừ trường hợp nguồn là một biểu thức hằng số và giá trị thực tế sau khi chuyển đổi sẽ phù hợp với mục tiêu ty pe và sẽ tạo ra giá trị ban đầu khi được chuyển đổi trở lại loại gốc hoặc & hellip;

(tôi nhấn mạnh)

+0

Tìm và cảm ơn bạn đã tham khảo. Tôi không biết rằng các biểu thức liên tục được xử lý khác nhau. –

+0

+1 nói cách khác, không thể mất bất kỳ thông tin nào –

+0

Bất kỳ ý tưởng nào tại sao ví dụ cuối cùng của tôi tạo ra lỗi thu hẹp? –

7

Tôi không thấy lý do tại sao điều này sẽ xảy ra lỗi vì tất cả ba số nguyên có thể được biểu diễn chính xác là float.

Điều đó nói rằng, tôi có thể nhận g++ để cung cấp cho tôi một cảnh báo nếu tôi bao gồm một hằng số không phù hợp trong một float:

warning: narrowing conversion of '2112112112' from 'int' to 'float' inside { } [-Wnarrowing] 
Các vấn đề liên quan