Что это будет оцениваться в логическом выражении?

при условии, что у меня есть следующие переменные

bool b;
int i;
T* ptr;

когда я положил b, i или же ptrили любые другие переменные, которые у меня есть, в логическом выражении, как

var1 && var2

Что будет оцениваться, чтобы решить это выражение? Стандарт C ++ 11 говорит о том, что часть от var1 а также var2 что способствует определению логического результата? Есть неявные кастинги?

Мне не ясно, что стандарт говорит об этом.


РЕДАКТИРОВАТЬ

Я заинтересован в том, как общий T Тип преобразуется в bool и как логическое выражение решается в соответствии со стандартом

-1

Решение

§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.)

3

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

Мне не понятно, о чем ты спрашиваешь. Переменная является истинной в C и C ++, если она не равна нулю. && Оператор оценивает правый операнд, только если левый операнд имеет значение true. Истинное значение экземпляра класса T не существует, если нет функции преобразования. Это все в стандарте.

4

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