我目前正在学习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检查了我的例子