允许转换`operator void()`吗?

时间:2015-05-29 14:45:41

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

我目前正在学习C ++标准并且来到这个疯狂的例子:

#include <iostream>

int i = 0;

class A {
public:
    operator void() {
        std::cout << ++i << std::endl;
    }
};

int main() { 
    A a, b;
    A c = (a, b);
    static_cast<void>(a);
    (void) a;
}

尽管operator void()有副作用,但它从未被调用(至少没有打印到stdout)。但是operator void()不被禁止,我发现触发它的唯一方法是使用挥发物:

  

5.2.9静态演员[expr.static.cast]

     

[...]   任何表达式都可以显式转换为 cv void类型,在这种情况下,它将成为废弃值表达式(第5条)。

     

5个表达式[expr]

     

[...]   如果和,则应用左值到右值的转换(4.1)   只有当表达式是volatile限定类型的glvalue时,它才是以下之一:[...]

截至N3797草案

我尝试将volatile添加到我的代码中,但没有打印出来。

有没有办法触发operator void()或它是死代码?当然问题是推测性的,背后没有实际用途。

我用G ++ 4.9和CLang ++ 3.3检查了我的例子

0 个答案:

没有答案