为什么无效转换功能很奇怪?

Pra*_*tic 8 c++ type-conversion language-lawyer c++11

为什么以下程序

#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();
}
Run Code Online (Sandbox Code Playgroud)

输出这个

C::operator int()
Run Code Online (Sandbox Code Playgroud)

而不是这个?

C::operator int()
C::operator void()
Run Code Online (Sandbox Code Playgroud)

coliru现场演示.

一如既往,直接的回答是"因为标准是这么说的".

C++ 11标准,§12.3.2

转换函数从不用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),转换为该类型的(可能是cv限定的)基类(或引用它)或(可能是cv-qualified)void.

那么为什么标准会这样说呢?使空洞转换功能成为特殊情况有什么好处?

其他说明见脚注116:

这些转换被视为标准转换,用于重载解析(13.3.3.1,13.3.3.1.4),因此初始化(8.5)和显式转换(5.2.9).转换为void不会调用任何转换函数(5.2.9).即使从未直接调用执行转换,也可以声明此类转换函数,并且可以通过调用基类中的虚拟转换函数来实现.

我只是习惯于(void)对有关未使用变量的编译器警告进行静音.它看起来基本上也是其他人使用它的东西.

为什么将未使用的返回值转换为void?

如果void转换函数遵循典型的转换函数规则,则可能会出现意外情况,但对于任何具有副作用的转换函数而言都是如此,并且创建这些意外将由程序员自行决定.