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有一个转换运算符模板。
我正在玩弄 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 keywordtemplate
(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有一个转换运算符模板。