2012-01-25 62 views
5

我只是寫了一個函數:std :: string如何管理這個技巧?

void doSomeStuffWithTheString(const std::string& value) { 
... 
std::string v = value; 
std::cout << value.c_str(); 
... 
} 

但後來我把這個與

doSomeStuffWithTheString("foo"); 

和它的作品。所以我會認爲這是行得通的(一個const char *來初始化一個std :: string的隱式實例)該值將不得不通過值傳遞,但在這種情況下通過(const)引用傳遞。

是否有任何機會一個隱式的時間std ::字符串實例從const char *當引用是常量?如果沒有,那麼這可能如何工作?

編輯

如果函數與

void doSomeStuffWithTheString(const char* value); 

哪一個會選擇編譯器超載會發生什麼?

+0

你幾乎回答了你自己的問題:) – pezcode

+0

有趣,不知道。什麼是對象需要這樣做會有這樣的隱式構造函數發生在const-by-ref調用上(以及如何避免它)? – lurscher

+1

程序格式不正確:'std :: string = value;'無效並且應該被你的編譯器拒絕。 –

回答

7

std::string類型從const char*有一個隱式轉換(通過構造函數)。這就是允許字符串文字"foo"轉換爲std::string的原因。這會產生一個臨時值。在C++中,將const &設置爲臨時值是合法的,因此這一切都保持在一起。

在C++中使用自己的自定義類型可以複製此技巧。

class Example { 
public: 
    Example(const char* pValue) {} 
}; 

void Method(const Example& e) { 
    ... 
} 

Method("foo"); 
0

是的,臨時std::string是從字符串文字構造的。

0

恰好,使用std::string默認的構造

0

「的值將不得不由值來傳遞,但是在這種情況下,通過(常數)引用傳遞」。

有一個C++特徵,其中有可能通過臨時值(在這種情況下,臨時std::stringconst char *隱式轉換)到的常量引用的參數(在這種情況下,const std::string &)型。