为什么<而不是流输出中的<<仍然编译

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

本文关键字:编译 为什么 输出      更新时间:2023-10-16

今天我在程序中犯了一个小错别字,并且徘徊为什么我没有得到任何输出,尽管程序编译得很好。基本上它简化为:

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

我完全不知道这里执行了什么样的隐式转换,所以程序仍然可以编译(g++4.9.2 甚至 g++5)。我刚刚意识到 clang++ 拒绝代码。是否正在执行void*转换(想不出其他任何事情)?我记得看到过这样的东西,但我认为它是在 g++5 中解决的,但事实似乎并非如此。

编辑:我没有用-std=c++11编译,所以代码在C++11之前有效(由于转换为ostreamvoid*)。当使用 g++5 编译时-std=c++11 拒绝代码,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 bool on basic_ios 替换operator void*

仅在 C++11 之前有效。

你基本上在做:((void *) std::cout) < ((char *) "test")

相关文章: