为什么<而不是流输出中的<<仍然编译
Why does < instead of << in stream output still compile?
今天我在程序中犯了一个小错别字,并且徘徊为什么我没有得到任何输出,尽管程序编译得很好。基本上它简化为:
#include <iostream>
int main()
{
std::cout < "test"; // no << but <
}
我完全不知道这里执行了什么样的隐式转换,所以程序仍然可以编译(g++4.9.2 甚至 g++5)。我刚刚意识到 clang++ 拒绝代码。是否正在执行void*
转换(想不出其他任何事情)?我记得看到过这样的东西,但我认为它是在 g++5 中解决的,但事实似乎并非如此。
编辑:我没有用-std=c++11
编译,所以代码在C++11之前有效(由于转换为ostream
的void*
)。当使用 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")
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么 gcc 编译这个而 msvc 没有
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 编译 llvm 3.1 时,为什么会出现错误:在">"标记之前预期主表达式
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 为什么下面的模板化类成员函数无法编译?
- 为什么通过指针编译时不能分配 const 初始化
- 如果我的手机是 ARMv8,为什么 Android Studio 会C++编译为 ARMv7?
- 为什么传递非静态成员函数会导致编译错误?
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- 为什么使用EnTT进程无法编译
- 为什么许多项目不提供预编译的二进制文件?
- 包含 std::forward 会产生错误,但其省略会编译.为什么
- 我相信 -O2 标志导致我不得不在每台机器上重新编译.为什么
- clang 在 Coliru 中编译此代码段,但不在编译器资源管理器中编译.为什么