簡體   English   中英

從std :: stringstream傳遞std :: string引用作為參數

[英]Passing std::string reference from std::stringstream as parameter

我使用std :: stringstream構造一個字符串,然后嘗試將完成的字符串作為對函數的引用傳遞給一個函數,該函數將std :: string&作為參數。

我在GCC上收到編譯錯誤:

../src/so.cpp:22:21: error: invalid initialization of non-const reference of type ‘std::string& {aka std::basic_string<char>&}’ from an rvalue of type ‘std::basic_stringstream<char>::__string_type {aka std::basic_string<char>}’
../src/so.cpp:12:6: error: in passing argument 1 of ‘void myFunc(std::string&)’
make: *** [src/so.o] Error 1

在Windows VS2012上編譯相同的代碼,但在我的Linux和Android版本上失敗。 這是什么原因?

我可以通過暫時將ss.str()分配給臨時的std :: string然后通過引用傳遞該字符串來解決這個問題,但這看起來有些愚蠢。 干凈利落的正確方法是什么?

#include <iostream>
#include <sstream>

void myFunc (std::string& msg)
{
    std::cout << msg << std::endl;
}

int main (void)
{
    std::stringstream ss;
    ss << "this is a test";

    myFunc (ss.str());              // Fails

    std::string s = ss.str();
    myFunc (s);                     // Pass

    return 0;
}

問題是myFunc采用非const左值引用。 stringstream::str()按值返回一個字符串。 您不能在標准C ++中將臨時綁定到非const左值引用,但VS有一個允許此擴展的“擴展”。 這就是它編譯VS而不是其他編譯器的原因。

另一方面, const左值引用可以綁定到rvalues。 所以修改你的功能會使它工作:

void myFunc (const std::string &msg) { /* as before */ }

改變這個:

void myFunc (std::string& msg)

對此:

void myFunc (const std::string& msg)
//           ^^^^^ this will allow temporaries like ss.str()

有些版本的Visual Studio會愚蠢地允許臨時綁定到非const引用。 然而,這是危險的,無效的C ++

因為你沒有寫入myFunc的字符串,所以接受一個const引用:

void myFunc (std::string const &msg)
{
  std::cout << msg << std::endl;
}

那些可以綁定到臨時對象

所以你遇到這個錯誤的原因是ss.str()返回一個const字符串,而不是一個字符串。 通過創建一個新字符串,您將創建一個非const變量,該變量設置為與ss.str()相同的值,因此可以傳遞給myFunc()。 創建一個新的字符串可能是解決這個問題的最簡單方法,並且仍然按原樣使用該函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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