Я читаю новейшую книгу Страуструпа по С ++ (4-е издание), и следующий пример из книги не выдает ошибку.
#include <iostream>
using namespace std;
int main(const int argc, const char* argv[]) {
// Narrowing conversion.
// According to Stroustrup, an error should happen here
// because the curly-brace-delimited initializer
// saves us from conversions that lose information.
// But after compiling and running the code the output is 7.
int i2 {7.2};
cout << i2 << endl;
return 0;
}
Я использую следующую команду для компиляции кода в системе Gentoo. (версия g ++: 4.6.3)
g++ -std=c++0x -o output input.cpp
Почему не выдает ошибку?
Более свежая версия gcc (4.8.1) рассматривает это как предупреждение:
trash9.cpp: In function 'int main(int, const char**)':
trash9.cpp:11:14: warning: narrowing conversion of '7.2000000000000002e+0' from
'double' to 'int' inside { } [-Wnarrowing]
int i2 {7.2};
Стандарт требует, чтобы компилятор выпустил «диагностику», поэтому (с правильной документацией) это, несомненно, соответствует требованиям. Компилятор может продолжить компиляцию кода после этого.
VC ++ делает ближе к тому, что вы, очевидно, хотите:
trash9.cpp(11) : error C2397: conversion from 'double' to 'int' requires a narro
wing conversion
Других решений пока нет …