首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么流输出中的<而不是<<仍然编译?

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

Stack Overflow用户
提问于 2015-04-18 22:06:48
回答 2查看 339关注 0票数 11

今天,我在我的程序中做了一个小错误,并且在思考为什么我没有得到任何输出,尽管这个程序编译得很好。从根本上说,它是这样的:

代码语言:javascript
复制
#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仍然接受该代码。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-18 22:11:33

是的,编译器正在将cout转换为void*。如果您使用-S开关获取代码的反汇编,您将看到如下所示:

代码语言:javascript
复制
    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

票数 9
EN

Stack Overflow用户

发布于 2015-04-18 22:09:27

这仅在C++11之前有效。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29723423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档