/ / C ++ 11 перетворення basic_istream у bool - c ++ 11, перетворення типу, неявна конверсія, istream, булеві операції

C + + 11 basic_istream conversion to bool - c + + 11, перетворення типу, перетворення неявно, istream, логічні операції

З того, що я читав, C ++ 11 більше не підтримує неявне перетворення в void * для istream / ostream, яке потім може бути неявно перетворене в bool, для використання в циклі while і т.д. Наприклад:

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

}
cout << "break";

Тепер стандарт реалізує явний оператор bool, так

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

буде новим стандартним підтримуваним методом. Однак і в Visual Studio 2017, і в GNU g ++ зі знаком -std = c ++ 11 обидві версії компілюються ідеально. Якщо явний шлях до bool з istream не підтримується стандартом, чому це так? Я можу зрозуміти, що VS грає швидко і вільно зі стандартом, але GNU теж? Дякую за будь-яке розуміння.

Відповіді:

2 для відповіді № 1

Неявна конверсія в void* було видалено, але його було замінено явним перетворенням у bool. Починаючи з C ++ 11, оператор явного відтворення вбул лікується спеціально. Він відомий як "контекстна конверсія", і його можна використовувати неявно в виразі, який природно очікує булевого значення: умова оператора if, стан термінального оператора тощо.