Использовали ли старые версии 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)

Обратите внимание на явную ссылку на "истину" и "ложь", которые являются логическими понятиями.

Другие вопросы по тегам