2017-06-01 69 views
0

我正在使用以下代碼進行原型設計。爲什麼將char *傳遞給字符串參數會產生編譯錯誤?

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <string> 


template<class container, class value> class Add { 
public: 
    Add(){}; 
    ~Add(){}; 
    void add_value(container& cont, value& val){ 
     std::for_each(cont.begin(), cont.end(), [&val](value& v){v +=val;}); 
    }; 
}; 


int main(int argc, char const *argv[]) 
{ 
    Add<std::vector<std::string>, std::string> a; 
    std::vector<std::string> vec = {"a", "b", "c", "d"}; 
    std::string foo= "1"; 
    a.add_value(vec, foo); // compiles fine 
    a.add_value(vec, "1"); // generates an error 
    return 0; 
} 

,我得到了以下錯誤

template.cpp:28:25: error: invalid initialization of non-const reference of type ‘std::__cxx11::basic_string<char>&’ from an rvalue of type ‘std::__cxx11::basic_string<char>’ 

爲什麼它不可能通過一個char*string說法?

據我所知,爲了將char*轉換爲std::string並將結果傳遞給該函數,將執行一個隱式轉換。

+6

功能需要採取一個const引用。非const引用不能綁定到臨時對象,比如將「1」轉換爲字符串所產生的臨時對象。錯誤消息告訴你。 –

+0

我在這裏很好奇。爲什麼非const引用不能綁定到右值? – hannibal

+0

因爲C++標準沒有說。 –

回答

4

您定義的add_value如下:

void add_value(container& cont, value& val) 

凡字符串是一個非const引用,編譯器期望此引用指向一個修改變量別的地方。

但是,當您傳遞const char[]時,即使此類型可以轉換爲字符串(以防編譯),它仍會動態完成,且字符串不可修改。實際上,char*也不可修改。這就是爲什麼你的代碼不能編譯。

你可以定義你的函數如下,它會工作:

void add_value(container& cont, const value& val) 
+3

不是我,但你有幾件事情有點不對:''1「'不是'char *',而是'const char []'。它可以衰減到'const char *',但永遠不會是'char *'。此外,它不編譯的原因不是因爲字符串文字不可修改,而是因爲OP試圖將一個prvalue綁定到一個左值引用。 – Rakete1111

+2

您的短語「即使此類型可以轉換爲字符串」也意味着它不能。實際上,'const char *'(或者,實際上是const char [2]')可以轉換爲'std :: string',這就是爲什麼只要將參數設置爲'const&'的原因。 –

+0

感謝您的反饋。 @ Rakete1111:不確定字符串文字是否是prvarlue,我錯過了什麼? –

相關問題