![](/img/trans.png)
[英]cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
[英]std::vector : cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
嘗試做一些簡單的事情時,我遇到了一個令人困惑的錯誤消息
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有類似的問題,如重載運算符<<:無法將左值綁定到'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
是一個左值,因此無法綁定到std::ostream&&
。 因此錯誤。
這是gcc的一個已知問題, 我就此提出了一個增強請求。
“唯一”的問題是,您嘗試打印到控制台的東西沒有operator<<
。 不幸的是,錯誤消息不是很有幫助。 :(
順便說一句,這個問題與vector
或l值和r值引用無關。 一個最小的例子:
#include <iostream>
struct A { };
int main() {
A a;
std::cout << a;
}
請參閱增強請求中有關血淋淋的詳細信息的討論。 簡而言之,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;
~~~~~~~~~ ^ ~
在這里,第一行清楚地說明了問題所在。
類std::basic_ostream
沒有為std::vector
定義的operator <<
。
你想要的是以下內容
for ( int x : std::vector<int> { 1, 2, 3 } ) std::cout << x << ' ';
std::cout << std::endl;
雖然它可以寫得更簡單
for ( int x : { 1, 2, 3 } ) std::cout << x << ' ';
std::cout << std::endl;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.