今天我在我的程序中输入了一个小错误,并且为什么我没有得到任何输出而徘徊,尽管程序编译得很好。基本上它减少到这个:
#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")