C++ 为什么<;而不是<&书信电报;流内输出仍然编译?

C++ 为什么<;而不是<&书信电报;流内输出仍然编译?,c++,implicit-conversion,ostream,C++,Implicit Conversion,Ostream,今天我在我的程序中输入了一个小错误,我想知道为什么我没有得到任何输出,尽管程序编译得很好。基本上可以归结为: #include <iostream> int main() { std::cout < "test"; // no << but < } #包括 int main() { std::cout

今天我在我的程序中输入了一个小错误,我想知道为什么我没有得到任何输出,尽管程序编译得很好。基本上可以归结为:

#include <iostream>

int main()
{
    std::cout < "test"; // no << but <
}
#包括
int main()
{

std::cout<“test”//no这仅在C++11之前有效


您基本上是这样做的:
((void*)std::cout)<((char*)“test”)
是的,编译器正在将
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
mov-edi,偏移平面:std::cout+8
调用std::basic_ios::operator void*()const
cmp rax,偏移平坦:.LC0
挫折
测试铝,铝
这表明
操作员void*
是罪魁祸首


与Bill Lynch所说的相反,我可以在
-std=c++11
上复制它。但是,它确实似乎是一个实现缺陷,因为c++11应该在
基本ios上用
操作符bool
替换
操作符void*
,抱歉,我收回,我没有使用
-std=c++11
…g++5 re事实上,g++4.9.2没有,即使使用
-std=c++11
。在c++11中,在
std::ostream
上没有
操作符void*()
。因此这将是一个实现缺陷。我认为这是g++4.9中的一个缺陷(g++5拒绝了它)为了不破坏它的ABI,g++4.9在某些方面并不完全符合C++11。这是其中之一。g++5将完全符合C++11。是的,我只是在C++11中重新检查了这一点。我从g++4.9.2中得到了一个警告,关于一个未使用的计算值,尽管在使用
-Wall
时。@Raphael确实,当我编译时,我看起来一点也不奇怪所有的警告,现在我看到并意识到发生了什么,尽管我不得不说这有点不寻常。我大部分时间都在使用
-Wall
,但是这是一段很小的代码,我用升华的文本编译,并意识到它神奇地工作了。为什么给0作为输出?@Destructor,因为你最后比较了两个指针:
(void*)STD::CUT/CODE,字符串字符串被衰减为<代码> const char < /Cux>指针,比较似乎是假的。请参阅答案,了解转换的原因。@ VSOFTCO:这种类型的指针比较是根据C++标准的未指定行为。