Я играл с классом Foo
, который определял неявный operator bool()
. Я использовал Foo
как возвращаемый тип для нескольких функций, поэтому я мог получить информацию о том, что было сделано, и вызвать Foo::operator bool()
, чтобы убедиться, что операция выполнена успешно.
Из любопытства я также попробовал явный вызов оператора преобразования при использовании Foo
:
if(!func().operator bool()) // func returned Foo
throw std::logic_error("operation was not successful");
Это сработало нормально. Затем я вдруг решил сбросить класс Foo
и перейти с простым bool
, но я забыл удалить вызов .operator bool()
на возвращаемое значение функции. И поэтому я обнаружил набор странных поведений компилятора Visual С++ 12.0 (Visual Studio 2013).
Ни один из явных вызовов операторов преобразования в bool
не действует в GCC: request for member ‘operator bool’ in ‘true’, which is of non-class type ‘bool’
Теперь поведение, которое я получаю в Visual Studio:
#include <iostream>
using std::cout;
using std::endl;
bool func()
{
return true;
}
int main()
{
bool b = true.operator bool();
cout << b << endl; // error C4700: uninitialized local variable 'b' used
// evaluates to true (probably like b would do if it compiled)
if(false.operator bool())
cout << "a" << endl;
cout << func().operator bool() << endl; // prints nothing
int m = 10;
cout << m.operator int() << endl; // prints nothing
// correctly gives error: left of '.<' must have class/struct/union
cout << m.operator <(10) << endl;
}
Даже intellisense прав и показывает Error: expression must have a class type
.
Есть ли объяснение всему этому? Жук? (Нежелательное) расширение? Что это?