С++ 11 преобразование basic_istream в bool

Из того, что я прочитал, С++ 11 больше не поддерживает неявное преобразование в void* для istream/ostream, которое затем можно было бы неявно преобразовать в bool для использования в циклах while и т. д. Например:

    string test;
    while((getline(cin,test)))
    {
        cout << "received" << endl;

    }
    cout << "break";

Стандарт теперь реализует явный логический оператор, поэтому

while(static_cast<bool>(getline(cin,test)))

будет новым стандартным поддерживаемым методом. Однако и в Visual Studio 2017, и в GNU g++ с флагом -std=c++11 обе версии прекрасно компилируются. Почему стандарт не поддерживает неявный путь к bool из istream? Я могу понять, как VS играет быстро и свободно со стандартом, но GNU тоже? Спасибо за любое понимание.


person schulmaster    schedule 13.10.2017    source источник


Ответы (1)


Неявное преобразование в void* было удалено, но заменено явным преобразованием в bool. Начиная с C++11, явный оператор приведения к bool обрабатывается особым образом. Оно известно как «контекстное преобразование» и может неявно использоваться в выражении, которое естественным образом ожидает логическое значение: условие оператора if, условие тернарного оператора и т. д.

person Sneftel    schedule 13.10.2017