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

时间:2015-02-22 11:43:06

标签: c++ c++11 type-conversion language-lawyer

为什么以下程序

#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()

coliru.

的现场演示

一如既往,立即回答“因为标准是这样说的”。

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转换函数遵循典型的转换函数规则,则可能会出现意外情况,但对于任何具有副作用的转换函数而言都是如此,并且会产生这些意外,这将由程序员自行决定。

0 个答案:

没有答案