我需要創建一個字符串100 A字符。C++ 11字符串初始化
爲什麼以下
std::string myString = {100, 'A'};
得到不同的結果比
std::string myString(100, 'A');
?
我需要創建一個字符串100 A字符。C++ 11字符串初始化
爲什麼以下
std::string myString = {100, 'A'};
得到不同的結果比
std::string myString(100, 'A');
?
std::string myString = {100, 'A'};
是初始化使用初始化列表。它創建了2個字符的字符串:一個與代碼100和 'A'
std::string myString(100, 'A');
調用下面的構造:
string (size_t n, char c);
這將創建100「A的
形式上,第一個參數僅僅是一個值爲100的char;如果你的系統把'char'值視爲ASCII,那麼它就是ASCII碼。雖然這很常見,但它不是C++語言定義所要求的,有些系統並非如此。 – 2013-03-13 16:22:24
@Fanael - 我不知道它有多難,但這是一個經常被忽視的重要問題,只是編輯文本並沒有提醒人們。 – 2013-03-13 16:26:25
@PeteBecker:這是否意味着'std :: string s = {100,'A'};'是未定義的行爲?這不會使C++ 11中創建統一初始化語法的大多數意圖無效嗎? – 2013-03-13 16:32:00
第一次初始化爲100和A
,第二次調用構造函數重載std::string
。
是的,該構造函數會給你一個帶有100個「A」字符的字符串。 – juanchopanza 2013-03-13 16:19:59
對於通用的初始化字符串,只需用'{}'替換'()'即可。你應該做'std :: string myString {100,'A'};' – 2013-03-13 16:25:00
@CrazyEddie,但這是一個例子,括號內的改變會從根本上改變程序的行爲。 'initializer_list'構造函數優先於其他所有構造函數。 '='符號在這裏沒有區別。 [見演示](http://ideone.com/VxAQUY)。 – juanchopanza 2013-03-13 16:37:45
@CrazyEddie這有什麼區別?結果仍然不是'std :: string myString(100,'A');' – Praetorian 2013-03-13 16:38:42