在this answer下使用user GMan时,我制作了以下代码段(使用Visual C ++ 9编译):
class Class {
public:
operator void() {}
};
Class object;
static_cast<void>( object );
(void)object;
object.operator void();
在使用调试器后,我发现转换为void
不会调用Class::operator void()
,只有第三次调用(显式调用运算符)实际上会调用运算符,这两个转换只是什么都不做。
为什么operator void
没有使用强制转换语法调用?
答案 0 :(得分:29)
技术原因见于§12.3.2:
转换函数永远不会用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),转换为(可能是cv限定的)基类类型(或对它的引用),或(可能是cv-qualified)void 。
理由是(可能)允许§5.2.9/ 4工作:
任何表达式都可以显式转换为“cv void”类型。表达式值将被丢弃。
(void)expr
假设对任何表达式的结果值不执行任何操作,但如果它调用了转换运算符,则不会丢弃任何内容。因此,他们禁止在转化中使用operator void
。
为什么不将转换类型ID设为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)
对于某些东西,它在技术上仍然有用,所以也许这个理由足以让它不成形。