今天,我在我的程序中做了一个小错误,并且在思考为什么我没有得到任何输出,尽管这个程序编译得很好。从根本上说,它是这样的:
#include <iostream>
int main()
{
std::cout < "test"; // no << but <
}我完全不知道在这里执行什么样的隐式转换,所以程序仍然编译( g++4.9.2甚至g++5)。我刚刚意识到clang++拒绝代码。是否正在执行到void*的转换(其他什么都想不出来)?我记得看到过这样的事情,但我以为是在g++5中解决的,但情况似乎并非如此。
编辑:i没有用-std=c++11编译,所以代码在预C++11中是有效的(由于转换到void* of ostream)。当使用-std=c++11 g++5编译时,g++4.9仍然接受该代码。
发布于 2015-04-18 22:11:33
是的,编译器正在将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*是罪魁祸首。
与比尔林奇所说的相反,我可以在—std=c++11上在编译器资源管理器上复制它。但是,这确实是一个实现缺陷,因为C++11应该将operator void*替换为basic_ios上的operator bool。
发布于 2015-04-18 22:09:27
这仅在C++11之前有效。
你基本上是在做:((void *) std::cout) < ((char *) "test")
https://stackoverflow.com/questions/29723423
复制相似问题