Visual C++ - 显式调用基本类型的转换运算符

Visual C++ - call conversion operator on a primitive type explicitly

我正在玩弄 class Foo,它定义了一个隐含的 operator bool()。我使用 Foo 作为几个函数的 return 类型,所以我可以获得有关已完成的操作的信息,并调用 Foo::operator bool() 来了解操作是否已成功执行。

出于好奇,我还尝试在使用 Foo:

时显式调用转换运算符
if(!func().operator bool()) // func returned Foo
    throw std::logic_error("operation was not successful");

效果很好。然后,我突然决定放弃 Foo class 并使用简单的 bool 但我忘记删除 .operator bool() 对函数 return 值的调用。所以我发现了一组 Visual C++ 12.0 编译器的奇怪行为 (Visual Studio 2013)。


None 的转换运算符对 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;
}

甚至智能感知都是正确的并显示 Error: expression must have a class type。 这一切有解释吗?错误?一个(不需要的)扩展?这是什么?

不错的发现!该标准肯定会使此格式错误,需要进行诊断,[expr.ref]:

A postfix expression followed by a dot . or an arrow ->, optionally followed by the keyword template (14.2), and then followed by an id-expression, is a postfix expression. [..] For the first option (dot) the first expression shall have complete class type.

此外,不是扩展:将是一个毫无意义的扩展。似乎 VC++ 用一些 internal (class-like?) type:

实现了 bool

In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte.

该类型的 class-like 语义显然没有被完全抑制。甚至

bool b;
b.operator std::string();

编译(giving a seemingly empty string),暗示内部class有一个转换运算符模板。