今天我在我的程序中输入了一个小错误,并且为什么我没有得到任何输出而徘徊,尽管程序编译得很好。基本上它减少到这个:
#include <iostream>
int main()
{
std::cout < "test"; // no << but <
}
我完全不知道在这里执行了什么样的隐式转换,因此程序仍然可以编译(g ++ 4.9.2甚至g ++ 5)。我刚刚意识到clang ++拒绝代码。有转换吗? void*
被执行(想不出别的什么)?我记得看过这样的东西,但我认为它是用g ++ 5解决的,但事实并非如此。
编辑: 我没有编译 -std=c++11
,所以代码在pre-C ++ 11中有效(由于转换为 void*
的 ostream
)。编译时 -std=c++11
g ++ 5拒绝代码,g ++ 4.9仍然接受它。
是的,编译器正在转换 cout
到了 void*
。如果你使用 -S
切换到代码的反汇编,你会看到这样的事情:
mov edi, OFFSET FLAT:std::cout+8
call std::basic_ios<char, std::char_traits<char> >::operator void*() const
cmp rax, OFFSET FLAT:.LC0
setb al
test al, al
这说清楚了 operator void*
是罪魁祸首。
与Bill Lynch所说的相反,我能够用它重现它 —std=c++11
上 编译器资源管理器。但是,它似乎确实是一个实现缺陷,因为C ++ 11应该已经被替换 operator void*
同 operator bool
上 basic_ios
。
这仅在C ++ 11之前有效。
你基本上是这样做的: ((void *) std::cout) < ((char *) "test")