gpt4 book ai didi

c++ - 为什么流输出中的 < 而不是 << 仍然可以编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:49:24 24 4
gpt4 key购买 nike

今天我在我的程序中犯了一个小错别字,虽然程序编译正常,但我一直在想为什么我没有得到任何输出。基本上它简化为:

#include <iostream>

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

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

编辑: 我没有使用 -std=c++11 进行编译,因此代码在 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++11Compiler Explorer 上重现它.然而,这确实是一个实现缺陷,因为 C++11 应该在 basic_ios 上用 operator bool 替换 operator void*

关于c++ - 为什么流输出中的 < 而不是 << 仍然可以编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31876660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com