Bởi vì nguồn là một biểu hiện liên tục và tràn không xảy ra đối với những trường hợp này, sau đó narrowing conversion lỗi sẽ không được kích hoạt.
(tôi nhấn mạnh)
chuyển đổi từ một đôi dài sẽ tăng gấp đôi hoặc nổi và chuyển đổi từ đôi nổi, trừ trường hợp nguồn là một biểu hiện liên tục và tràn không xảy ra
Nếu bạn sử dụng nó với biến số double
(tức là biểu thức không liên tục) hoặc hằng số có giá trị lớn gây ra quá mức, thông báo chẩn đoán sẽ được tạo. ví dụ.
double d = 3.14159;
float a {d}; // non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list
EDIT (đối với đầu vào dài hơn)
Bởi vì ngay cả khi giá trị không thể được đại diện một cách chính xác bởi float
, tràn vẫn không xảy ra, sau đó nó cho phép.
$8.6.4/7.2 List-initialization (tôi emphasie)
từ lâu gấp đôi để tăng gấp đôi hoặc trôi nổi, hoặc từ đôi nổ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 nằm trong phạm vi của các giá trị có thể được biểu diễn (ngay cả khi nó không thể được đại diện chính xác), hoặc
afaik, nó không cảnh báo bạn nếu một giá trị chữ cụ thể có thể được biểu diễn theo loại hẹp hơn mà không mất chính xác –
Điều này không biên dịch trên VS2015 (lỗi 2397) – Fefux