Это выглядит как:
bool b = {2} ;
действительно является сужающим преобразованием, если мы посмотрим на черновик стандарта C++, раздел 8.5.4
Инициализация списка, параграф 7 гласит:
Сужающее преобразование — это неявное преобразование.
и включите следующий маркер (выделено мной):
от целочисленного типа или типа перечисления с незаданной областью к целочисленному типу, который не может представлять все значения исходного типа, за исключением случаев, когда источником является постоянное выражение, значение которого после интегральных преобразований будет соответствовать целевому типу.
bool
не может представлять значение 2
, так что это сужающее преобразование в самом строгом смысле. Что имеет смысл, весь смысл инициализации {}
заключается в предотвращении неявных преобразований и увеличении безопасность ввода. На что опирается старый стиль, на который вы здесь ссылаетесь:
bool b = 2
который зависит от раздела 4.12
Булевы преобразования, в котором говорится:
[...] Нулевое значение, значение нулевого указателя или значение нулевого указателя элемента преобразуется в false; любое другое значение преобразуется в true. [...]
Конечно, вся посылка о том, что {2}
будет сужающим преобразованием, основывается на предположении, что значения true и false равны 1
и 0
, что, как и насколько я могу судить, не гарантируется в стандарте. Хотя подразумевается, что это единственное, что стандарт обещает в преобразованиях, но если мы собираемся использовать литерал, нам не нужно полагаться на это предположение, у нас есть два совершенно хороших логические литералы для этих true
и false
, которые вы должны использовать.
Для полноты картины, это сужающее преобразование неправильное, оно требует диагностики, поэтому либо предупреждение, либо ошибка em> приемлемо. если мы посмотрим на абзац 3, там сказано:
Список-инициализация объекта или ссылки типа T определяется следующим образом:
и включите следующий маркер (выделено мной):
В противном случае, если в списке инициализаторов есть один элемент типа E и либо T не является ссылочным типом, либо его ссылочный тип связан со ссылкой на E, объект или ссылка инициализируется из этого элемента; если для преобразования элемента в T требуется сужающее преобразование (см. ниже), программа некорректна.
и включает следующий пример:
[ Example:
int x1 {2}; // OK
int x2 {2.0}; // error: narrowing
—end example ]
person
Shafik Yaghmour
schedule
02.11.2013
anything not 0
и0
как оtrue
иfalse
, насколько я могу судить, стандарт не обещает вам, чтоtrue
иfalse
будут1
и0
соответственно, он просто гарантирует конверсию. Поэтому, если вы собираетесь использовать литерал, используйтеtrue
иfalse
, что никогда не будет сужающим преобразованием. - person Shafik Yaghmour   schedule 02.11.2013