Неуверенность в поведении -Wconversion - PullRequest
2 голосов
/ 22 февраля 2012

Учитывая следующую ситуацию:

        char const a = (i == 0) ? 0 : copy[i - 1][j];

и

        char const a = (i == 0) ? '\0' : copy[i - 1][j];

Почему первый пример выдает следующее: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion], а второй - нет.

FWIW, copy - это char**.

Это поведение не ограничено char, то же самое можно увидеть и для других целочисленных размеров, поэтому, похоже, это вопрос продвижения по службе.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Когда один результирующий аргумент для ?: равен 0 (int), другой результирующий аргумент переводится в один и тот же тип - C ++ требует, чтобы оба возможных результата имели одинаковый тип.Как только продвижение обработано, компилятор отбрасывает информацию об исходном типе, поэтому во время выдачи предупреждения компилятор больше не знает, что то, о чем он предупреждал, было char все время.Он не жалуется на то, что второй аргумент понижен до char, потому что он знает, что литерал 0 является допустимым char значением.

1 голос
/ 22 февраля 2012

Разница в том, что тип '\ 0' - это char, а тип 0 - int.

Тип результата троичного оператора, когда второе и третье выражения имеют разные арифметические типы.получается путем перехода к общему арифметическому типу с использованием тех же правил, которые используются для типов в арифметических выражениях.Когда одно из выражений имеет тип «int», а другое - «char», тип результата - «int».Компилятор жалуется, что переменной типа присваивается значение "int".

Более умный компилятор может отслеживать возможный диапазон значений для результата (который в этом случае совпадает с диапазоном).возможных значений для "char") и сделать вывод, что на самом деле нет никакой вероятности того, что преобразование из "int" в "char" приведет к изменению значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...