为什么是;“操作员无效”;不使用强制转换语法调用? 我玩了下面的代码片段(用Visual C++ 9编译): 类{ 公众: 运算符void(){} }; 类对象; 静态投影(对象); (无效)反对; object.operator void();
在使用调试器之后,我发现对为什么是;“操作员无效”;不使用强制转换语法调用? 我玩了下面的代码片段(用Visual C++ 9编译): 类{ 公众: 运算符void(){} }; 类对象; 静态投影(对象); (无效)反对; object.operator void();,c++,casting,operators,operator-overloading,C++,Casting,Operators,Operator Overloading,在使用调试器之后,我发现对void进行强制转换不会调用Class::operator void(),只有第三次调用(显式调用操作符)实际调用了操作符,两次强制转换什么都不做 为什么未使用强制转换语法调用运算符void?技术原因见§12.3.2: 转换函数从不用于将(可能符合cv条件的)对象转换为(可能符合cv条件的)同一对象类型(或对它的引用)、该类型的(可能符合cv条件的)基类(或对它的引用)、或(可能符合cv条件的)void 理由是(可能)允许§5.2.9/4起作用: 任何表达式都可以显式转
void
进行强制转换不会调用Class::operator void()
,只有第三次调用(显式调用操作符)实际调用了操作符,两次强制转换什么都不做
为什么未使用强制转换语法调用
运算符void
?技术原因见§12.3.2:
转换函数从不用于将(可能符合cv条件的)对象转换为(可能符合cv条件的)同一对象类型(或对它的引用)、该类型的(可能符合cv条件的)基类(或对它的引用)、或(可能符合cv条件的)void
理由是(可能)允许§5.2.9/4起作用:
任何表达式都可以显式转换为“cv void”类型。表达式值将被丢弃
(void)expr
假设对任何表达式的结果值不做任何操作,但如果它调用了转换运算符,则不会丢弃任何内容。因此,他们禁止在转换中使用操作符void
为什么不将转换类型id设置为
void
?谁知道呢,但请记住这并不是毫无用处的:
structfoo
{
运算符void()
{
std::难道我喜欢你总是问一些奇怪但有趣的问题吗;)这是我的+1。你希望在没有强制转换的情况下执行什么代码?实际上没有……为什么强制转换要改变这个问题?@Eiko:如果那是操作符int()
,我写了(int)object;
,那么操作符int()
将被调用。事实证明,运算符void()
并非如此,所以我问了这个问题。为了说明这一点,Comeau给出了以下警告:“Class::operator void()”不会被隐式或显式转换调用。gcc警告:到void的转换将永远不会使用类型转换运算符为什么不将转换类型id设置为void
?"可能是因为void
可能隐藏在typedef或template参数后面?@dyp,这就是格式不错误的问题:意外行为:您希望转换运算符转换,但此运算符永远不会转换。使其格式不正确将有助于假定模板库的开发人员尽早捕获错误。B但是,至少现在编译器会对这种情况发出警告。@GreenScape有些用例你不在乎它是否会被调用,而当格式错误时,你必须生成特殊的情况。就像f(future.get())
用于未来
。此外,到void
的标准转换应该比任何用户定义的转换更具竞争力。
class Class {
public:
operator void() {}
};
Class object;
static_cast<void>( object );
(void)object;
object.operator void();
struct foo
{
operator void()
{
std::cout << "huh?" << std::endl;
}
};
typedef void (foo::*void_function)();
foo f;
void_function func = &foo::operator void;
(f.*func)(); // prints "huh"
f.operator void(); // also does (which you knew)