Использовали ли старые версии C++ оператор `int` класса при оценке условия в операторе`if()`?
Современные версии C++ пытаются использовать bool
оператор класса при оценке условия в if()
заявление. Другие операторы кастинга, такие как int
используется, когда нет bool
Оператор существует. Это продемонстрировано ниже.
#include <iostream>
using namespace std;
class TwoInts {
public:
int a,b;
operator bool() { cout << "TwoInts to bool" << endl; return 0;}
operator int() { cout << "TwoInts to int" << endl; return 0;}
};
class SixInts {
public:
int a[6];
operator int() { cout << "SixInts to int" << endl; return 0;}
};
int main(void) {
TwoInts T;
SixInts S;
if (T) cout << "xxx" << endl;
if (S) cout << "xxx" << endl;
return 0;
}
Запуск этого кода не вызывает сюрпризов:
TwoInts to bool
SixInts to int
Просматривая старый код C++, кажется, есть изменение, которое я хотел бы проверить.
Использовали ли старые версии C++ int
оператор класса при оценке условия в if()
заявление? Какие версии, если таковые имеются, сделали это?
Предлагаемый результат тогда был бы
TwoInts to int
SixInts to int
Некоторые детали относительно того, почему вопрос: проблемы с преобразованием старого большого целого класса могут быть связаны int
против bool
в if()
, Больше нет доступа к старому компилятору, поэтому нельзя проверять старое поведение.
[Редактировать]
Используя ответы ниже и еще несколько исследований:
Ответ: Да, во многих версиях C++ до ISO Standard (середина 1980-х -1998), в которых не было bool
, использовал броски, чтобы int
(или другие числовые типы). Существовала значительная вариация компилятора - она была предварительно стандартной.
Первый стандарт C++ ISO вышел в 1998 году (ISO/IEC 14882:1998 или C++98). Это определило bool
тип. Таким образом, стандарт ISO C++ всегда использовал bool
бросить в if()
,
2 ответа
Я не могу прямо ответить на вопрос наверняка, но Херб Саттер говорит, что не было bool
введите предстандартную версию C++, опубликованную в 1990 году.
В качестве таких, if
возможно, не использовал operator bool()
и мне кажется вероятным, что он использовал бы operator int()
если это сработало вообще. У меня нет копии справочного руководства C++ 1990 года, чтобы подтвердить это.
Не в стандартном C++. Строго говоря, в стандартном C++ оператор if пытается преобразовать содержащееся в нем выражение в bool
, а затем меняет поведение на основе этого.
ISO / IEC 14882: 2003 4.12 [conv.bool] / 1:
Значение арифметики, перечисления, указателя или указателя на тип члена может быть преобразовано в значение типа bool. Нулевое значение, нулевое значение указателя или нулевое значение указателя члена преобразуется в ложь; любое другое значение преобразуется в true.
6.4.1 [stmt.if] / 1:
Если условие (6.4) дает истину, то выполняется первое подзаголовок. Если присутствует другая часть оператора выбора и условие выдает false, выполняется второе подстановка. Во второй форме оператора if (который включает в себя else), если первая подстановка также является оператором if, тогда этот внутренний оператор if должен содержать часть else.76)
Обратите внимание на явную ссылку на "истину" и "ложь", которые являются логическими понятиями.