при условии, что у меня есть следующие переменные
bool b;
int i;
T* ptr;
когда я положил b
, i
или же ptr
или любые другие переменные, которые у меня есть, в логическом выражении, как
var1 && var2
Что будет оцениваться, чтобы решить это выражение? Стандарт C ++ 11 говорит о том, что часть от var1
а также var2
что способствует определению логического результата? Есть неявные кастинги?
Мне не ясно, что стандарт говорит об этом.
РЕДАКТИРОВАТЬ
Я заинтересован в том, как общий T
Тип преобразуется в bool
и как логическое выражение решается в соответствии со стандартом
§5.14 / 1
&&
оператор группы слева направо. Оба операнда контекстно преобразуются в типbool
(Пункт 4) … в отличие от&
,&&
гарантирует слева направо
оценка: второй операнд не оценивается, если первый операндfalse
,
§ 4/2
[Замечания: выражения с данным типом будут неявно преобразованы в другие типы в нескольких контекстах:— При использовании в качестве операндов операторов. Требования оператора к его операндам определяют тип пункта назначения (пункт 5).
…
Это примерно так же ясно, как стандарт. Первый var1
будет неявно преобразован в bool
и затем, если это true
, var2
будет неявно преобразован в bool
,
Редактировать: Я процитирую также §4.12 / 1
Значение арифметического, перечисления с незаданной областью, указателя или указателя на тип элемента может быть преобразовано в
тип значенияbool
, Нулевое значение, нулевое значение указателя или нулевое значение указателя члена преобразуется вfalse
;
любое другое значение преобразуется вtrue
, Prvalue типаstd::nullptr_t
может быть преобразовано в значение
типbool
; результирующее значениеfalse
,
Изменить 2: Для некоторого произвольного типа T
см. § 4/3,
… Некоторые языковые конструкции требуют, чтобы выражение было
преобразуется в логическое значение. Выражениеe
появляется в таком контексте, как говорят, контекстуально
конвертировано вbool
и является правильным, если и только если декларацияbool t(e);
хорошо сформирован, для некоторых
изобрел временную переменнуюt
(8.5).
О значении этой инициализации см. §8.5 / 16
— В противном случае, если исходный тип является (возможно, cv-квалифицированным) типом класса, рассматриваются функции преобразования.
Перечислены применимые функции преобразования (13.3.1.5), и лучшая из них выбирается через
разрешение перегрузки (13,3). Выбранное пользователем преобразование, выбранное таким образом, вызывается для преобразования инициализатора.
выражение в объект инициализируется. Если преобразование не может быть сделано или является неоднозначным,
инициализация плохо сформирована.
В §13.3.1.5 и §13.3 есть еще больше деталей, но вы будете читать всю ночь, а затем и некоторые. Но суть в том, что если T
это тип класса, то должна быть функция преобразования. Лучшей практикой будет определение explicit operator bool
для класса. Однако вы также можете сделать что-то вроде operator void*
, который является то, что std::ios
и его производные классы определяют, потому что void*
затем может быть преобразован в bool
в стандартной последовательности преобразования. (Это следует рассматривать как устаревшую идиому в C ++ 11.)
Мне не понятно, о чем ты спрашиваешь. Переменная является истинной в C и C ++, если она не равна нулю. && Оператор оценивает правый операнд, только если левый операнд имеет значение true. Истинное значение экземпляра класса T не существует, если нет функции преобразования. Это все в стандарте.