1

C++ 11에서는 istream/ostream에 대한 void * 로의 암시 적 변환을 더 이상 지원하지 않으므로 while 루프에서 사용할 수 있도록 암시 적으로 bool로 변환 될 수 있습니다. 예를 들어, 등 :C++ 11 bool 로의 basic_istream 변환

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

    } 
    cout << "break"; 

표준 이제 명백한 불리언 연산자를 구현하므로

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

새로운 표준 지원 방법 일 것이다. 그러나 Visual Studio 2017 및 -std = C++ 11 플래그가있는 GNU g ++에서 두 버전 모두 완벽하게 컴파일됩니다. 표준에 의해 지원되는 istream에서 bool에 암묵적인 통로없이, 이것은 왜입니까? 표준을 가지고 VS가 빠르며 느슨한 것을 이해할 수 있지만 GNU 역시 그렇습니까? 어떤 통찰력에도 감사드립니다.

답변

2

void*으로 암시 적 변환이 제거되었지만 명시 적 변환을 bool으로 바 꾸었습니다. C++ 11부터는 bool에 대한 명시 적 형변환 연산자가 특별히 처리됩니다. 이것은 "문맥 변환 (contextual conversion)"이라고 알려져 있으며, 자연스럽게 부울 값을 기대하는 표현식에 암시 적으로 사용될 수 있습니다 : if 문 조건, 삼항 연산자의 조건 등