инициализация — C ++ фигурные скобки со списком инициализаторов

Я читаю новейшую книгу Страуструпа по С ++ (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

Почему не выдает ошибку?

0

Решение

Более свежая версия 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
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector