为什么使用强制语法不调用“operator void”?

时间:2010-10-27 08:30:15

标签: c++ casting operators operator-overloading

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没有使用强制转换语法调用?

1 个答案:

答案 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)

对于某些东西,它在技术上仍然有用,所以也许这个理由足以让它不成形。