2016-02-27 59 views
0

我正在使用C++中的string::find搜索子字符串。當我使用const auto定義了一個字符串並稍後使用了該變量時,eclipse.替換爲->在C++中使用auto foo =「bar」vs std :: string 11

我發現這個SO thread其結論是auto foo = "bar"推斷爲(const char *) foo = "bar"。所以日食是正確的轉換.->即使我有點困惑開始。我錯誤地認爲auto將成爲std::string

會有下行推導auto foo = "bar"std::string而不是const char *?代碼大小增加,性能下降?

+7

類型' 「欄」''是爲const char [4]'。我不知道你爲什麼認爲這應該被自動轉換爲'std :: string'。 – IInspectable

+0

我認爲你很容易混淆這個事實,即你可以將一個'const char *'或'const char [4]'賦值給一個字符串:'std :: string str =「bar」;'引號之間的任何內容只是一個普通的const char數組。 –

+1

如果你想讓這個類型成爲'std :: string'就這麼說。不要在這裏使用'auto'。 –

回答

6

您的代碼可能有一百萬個類,可以從const char *隱式構建。爲什麼要選擇std::string

auto簡單地節省了一些鍵盤,如果你想有一個變量,同類型expression¹的鍵入你的,不是你想創建一個不同的對象。

(1)或多或少;事情總是會因爲C++而變得有些毛骨悚然......

3

好吧,你可能剛剛回答了你自己的問題。 std :: string需要稍微更多的空間(它有大小計數器),它的創建涉及動態分配等。

缺乏複雜的字符串類型可能看起來像時代錯誤,但是由於C++面向完全替代C其低效率,這是非常可以解釋的。

此外,std::string只是一個庫類。你可以選擇不同的字符串類型,例如QStringstd::experimental::string_view,如果你的任務需要它。 BTW,string_view更加類似於const char[],因爲它並沒有提供所有的動態操作,並且可以在constexpr

+0

謝謝。這確實就像是在和別人說話,第二天突然意識到爲什麼auto默認爲char *。我非常感謝你們三位花時間回答。 – kometen

2

用「Foobar的」是文字,而不是一個std::string的字符串。這將作爲const char[7]存儲在二進制文件的只讀部分中。

std::string te類型有一個隱含的從const char *轉換,因爲它有一個單一的參數構造函數而不顯式,如果你寫:std::string s = "foobar";將被調用。請注意,分配器的默認參數是在構造函數上分配的。使用const auto爲您提供實際類型而不是轉換類型。因此,將字符串文字轉換爲std::string實際上會創建另一個引用文字的對象。

http://en.cppreference.com/w/cpp/language/string_literal http://en.cppreference.com/w/cpp/string/basic_string

+2

'「foobar」'的類型不是'char const *',它是'char const [7]'(6'char's +終止空字符) – Praetorian

+0

是的。但在這種情況下幾乎沒有實際的區別。 – Alex

相關問題