c++ - std::vector : 无法将 'std::ostream {aka std::basic_ostream<char>}' 左值绑定(bind)到 'std::basic_ostream<char>&&'

标签 c++ gcc c++11 stl iostream

我在尝试做一些简单的事情时遇到了一个令人困惑的错误消息

std::cout << std::vector<int>{1,2,3};

上面写着

 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}; }

(使用 gcc-4.8.1 和 -std=c++11 测试)

SO 有类似的问题,例如 Overloading operator<<: cannot bind lvalue to ‘std::basic_ostream<char>&&’ ,这是关于一些具有嵌套类的用户定义类。对于该问题的公认答案,还有一项工作。

但我不知道这是否适用于 std::vector。谁能解释一下为什么std::vector会出现这个错误,以及如何解释?

谢谢

最佳答案

与模板相关的错误消息有时会令人困惑。问题是标准库没有定义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, " "));

至于为什么你会得到这个神秘的错误,它有助于分析完整的错误信息:

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)
     ^

显然有 operator<< 的模板重载它采用 std::ostream&& 类型的 lhs 参数和模板类型的 rhs 参数;它的存在是为了允许插入到临时流中。由于它是一个模板,因此它成为代码中表达式的最佳匹配。但是,std::cout是一个左值,所以它不能绑定(bind)到 std::ostream&& .因此出现错误。

关于c++ - std::vector : 无法将 'std::ostream {aka std::basic_ostream<char>}' 左值绑定(bind)到 'std::basic_ostream<char>&&',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24609915/

相关文章:

c++ - C++ 作用域静态初始化的汇编代码

c++ - 在 g++ 中编译 .c 假定 c++ 任何命令行选项都将其视为 .c

c++ - 在基本类型上使用 std::declval

python - 通过 pybind11 返回 numpy 数组

c++ - 绕过特定地址获取寄存器值【x86 assembly on Windows】

c++ - 没有运行时环境的断言

c++ - const_cast 和 std::move 从非引用中删除常量

c++ - 无法使用 ifstream 将 txt 文件的最后一部分写入 cout

c++ - Raspberry Pi ARM Float ABI 兼容性

c++ - "Unpack"一个用可变参数模板调用函数的数组