玩的时候这个答案 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(使用前将#替换为@)