簡體   English   中英

std :: vector:無法綁定&#39;std :: ostream {aka std :: basic_ostream <char> &#39;&#39;左右&#39;到&#39;std :: basic_ostream <char> &amp;&amp;”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM