Why does < instead of << in stream output still compile?

爱⌒轻易说出口 提交于 2019-11-30 23:17:34

问题


Today I made a small typo in my program, and was wandering why I wasn't getting any output, although the program compiled fine. Basically it reduces to this:

#include <iostream>

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

I have absolutely no idea what kind of implicit conversion is performed here so the program still compiles (both g++4.9.2 and even g++5). I just realized that clang++ rejects the code. Is there a conversion to void* being performed (cannot think of anything else)? I remember seeing something like this, but I thought it was addressed in g++5, but this doesn't seem to be the case.

EDIT: I was not compiling with -std=c++11, so the code was valid in pre-C++11 (due to conversion to void* of ostream). When compiling with -std=c++11 g++5 rejects the code, g++4.9 still accepts it.


回答1:


Yes, the compiler is converting cout to a void*. If you use the -S switch to get the code's disassembly, you'll see something like this:

    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

Which makes it clear that operator void* is the culprit.

Contrary to what Bill Lynch said, I'm able to reproduce it with —std=c++11 on Compiler Explorer. However, it does appear to be an implementation defect, since C++11 should have replaced operator void* with operator bool on basic_ios.




回答2:


This is only valid before C++11.

You're basically doing: ((void *) std::cout) < ((char *) "test")



来源:https://stackoverflow.com/questions/29723423/why-does-instead-of-in-stream-output-still-compile

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!