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

2024-04-23

玩的时候这个答案 https://stackoverflow.com/questions/4030959/will-a-variablename-c-statement-be-a-no-op-at-all-times/4030983#4030983 by 用户GMan https://stackoverflow.com/users/87234/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不使用强制转换语法调用?


其技术原因可在第 12.3.2 节中找到:

转换函数永远不会用于将(可能是 cv 限定的)对象转换为(可能是 cv 限定的)相同对象类型(或对其的引用),转换为该类型的(可能是 cv 限定的)基类(或对其的引用),或(可能符合简历资格)无效.

理由是(可能)允许 §5.2.9/4 发挥作用:

任何表达式都可以显式转换为类型“cv void”。表达式值被丢弃。

(void)expr假设对结果值不做任何事情any表达式,但如果它调用您的转换运算符,它不会丢弃任何内容。所以他们禁止使用operator void在转换中。


为什么不将转换类型 ID 设为格式错误void?谁知道呢,但请记住,事实并非如此totally无用:

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)

它在技术上仍然具有潜在用途某物,所以也许这是足够的理由,不会使其格式错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不使用强制转换语法调用“operator void”? 的相关文章

随机推荐