为什么以下程序
#include <iostream>
struct C
{
operator int()
{
std::cout << "C::operator int()" << std::endl;
return 0;
}
operator void()
{
std::cout << "C::operator void()" << std::endl;
}
};
int main()
{
C c;
(int)c;
(void)c;
// this does run the function:
// c.operator void();
}
输出此
C::operator int()
而不是这个?
C::operator int()
C::operator void()
的现场演示
一如既往,立即回答“因为标准是这样说的”。
C ++ 11标准,§12.3.2
转换函数永远不会用于转换 a(可能是 cv-qualified)对象(可能是cv-qualified)相同的对象类型 (或对它的引用),对(可能是cv认证的)基类 该类型(或对它的引用),或到(可能是cv-qualified)void。
那么为什么标准会这样说呢?使空洞转换功能成为特殊情况有什么好处?
附加说明见脚注116:
这些转化被视为标准转化 超载解决的目的(13.3.3.1,13.3.3.1.4)因此 初始化(8.5)和显式强制转换(5.2.9)。转换为无效 不会调用任何转换函数(5.2.9)。从来没有 直接调用执行转换,这样的转换函数即可 声明,可以通过呼叫虚拟来达到 基类中的转换函数。
我只使用(void)
来隐藏有关未使用变量的编译器警告。看起来这基本上也是其他人使用它的原因。
Why cast unused return values to void?
如果void
转换函数遵循典型的转换函数规则,则可能会出现意外情况,但对于任何具有副作用的转换函数而言都是如此,并且会产生这些意外,这将由程序员自行决定。