tin*_*lyx 21 c++ gcc iostream stl c++11
尝试做一些简单的事情时,我遇到了一个令人困惑的错误消息
std::cout << std::vector<int>{1,2,3};
Run Code Online (Sandbox Code Playgroud)
这说
cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
int main() { std::cout << std::vector<int>{1,2,3}; }
Run Code Online (Sandbox Code Playgroud)
(使用gcc-4.8.1和-std = c ++ 11测试)
SO有类似的问题,如重载运算符<<:无法将左值绑定到'std :: basic_ostream <char> &&',这是关于某些带嵌套类的用户定义类.还有一个工作围绕这个问题的公认答案.
但我不知道这是否适用std::vector.有人可以解释为什么会发生这种错误std::vector,以及如何解释它?
谢谢
Rei*_*ica 23
与模板相关的错误消息有时会令人困惑.问题是标准库没有定义operator <<用于插入std::vector(或任何其他容器)的重载std::ostream.因此,编译器无法找到合适的重载operator <<,并尽可能地报告此失败(遗憾的是,在您的情况下不太好/可读).
如果要流式传输整个容器,可以使用std::ostream_iterator:
auto v = std::vector<int>{1, 2, 3};
std::copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));
Run Code Online (Sandbox Code Playgroud)
至于为什么你正好得到这个神秘的错误,它有助于分析完整的错误信息:
prog.cpp: In function ‘int main()’:
prog.cpp:13:37: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
std::cout << std::vector<int>{1,2,3};
^
In file included from /usr/include/c++/4.8/iostream:39:0,
from prog.cpp:3:
/usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::vector<int>]’
operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
^
Run Code Online (Sandbox Code Playgroud)
显然有一个模板重载,operator<<它接受类型的lhs参数std::ostream&&和模板化类型的rhs参数; 它存在以允许插入临时流.由于它是一个模板,因此它成为代码中表达式的最佳匹配.但是,std::cout是一个左值,所以它无法绑定std::ostream&&.因此错误.
这是gcc的一个已知问题,我就此提出了一个增强请求.
"唯一"的问题是你试图打印到控制台的东西没有operator<<.不幸的是,错误消息不是很有帮助.:(
顺便说一句,这个问题与vectorl值和r值引用无关.一个最小的例子:
#include <iostream>
struct A { };
int main() {
A a;
std::cout << a;
}
Run Code Online (Sandbox Code Playgroud)
请参阅增强请求中有关血淋淋的详细信息的讨论.简而言之,gcc开发人员已经尝试改进错误消息,但事实证明这是非常困难的.
对于它的价值,我认为clang与libc ++ 的错误信息更加清晰:
clang++ -std=c++11 -stdlib=libc++ -lc++abi main.cpp && ./a.out
main.cpp:7:15: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'A')
std::cout << a;
~~~~~~~~~ ^ ~
Run Code Online (Sandbox Code Playgroud)
在这里,第一行清楚地说明了问题所在.
| 归档时间: |
|
| 查看次数: |
27784 次 |
| 最近记录: |