Подтвердить что ты не робот

Старые версии С++ использовали оператор `int` класса при оценке условия в выражении` if() `?

Современные версии С++ пытаются использовать оператор 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

Оглядываясь на старый код на С++, похоже, есть изменение, которое я хотел бы проверить.
Использовали ли старые версии С++ оператор int класса при оценке условия в выражении if()? Какие версии, если они есть, сделали это?

Предполагаемый вывод тогда был бы

TwoInts to int
SixInts to int

Некоторые сведения о том, почему вопрос: проблемы с преобразованием старого большого целочисленного класса могут быть связаны с int vs. bool в if(). У вас больше нет доступа к старому компилятору, поэтому он не может проверить старое поведение.


[Изменить]
Используя ответы ниже и еще несколько исследований:
Ответ: Да, многие версии ISO Standard С++ (в середине 1980-х - 1999), которые не имели bool, использовали приведения к int (или другим числовым типам). Существовало значительное изменение компилятора - оно было стандартным.

Первый стандарт С++ ISO вышел в 1998 году (ISO/IEC 14882: 1998 aka С++ 98). Он определил тип bool. Таким образом, стандарт ISO С++ всегда использовал листинг bool в if().

4b9b3361

Ответ 1

Я не могу напрямую ответить на вопрос наверняка, но Herb Sutter говорит, что в пред-стандартном типе не было типа bool версия С++, опубликованная в 1990 году.

Таким образом, if, возможно, не использовал operator bool(), и мне кажется вероятным, что он использовал бы operator int(), если бы он работал вообще. Однако у меня нет копии справочного руководства 1990 С++ для подтверждения.

Ответ 2

Не в стандартном С++. Строго говоря, в стандартном С++ оператор if пытается преобразовать содержащееся в нем выражение в bool, а затем изменяет поведение на основе этого.

ISO/IEC 14882: 2003 4.12 [conv.bool]/1:

Значение арифметики, перечисления, указателя или указателя на тип члена может быть преобразовано в rvalue типа bool. Значение нуля, значение нулевого указателя или значение указателя нулевого элемента преобразуется в значение false; любое другое значение преобразуется в значение true.

6.4.1 [stmt.if]/1:

Если условие (6.4) возвращает true, выполняется первое подзадача. Если другая часть оператора выбора присутствует и условие дает ложь, выполняется второе подзадача. Во второй форме выражения if (в том числе else), если первое подзадача является также оператором if, то этот внутренний оператор if должен содержать часть else.76)

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