2016-08-12 50 views
1

我正在閱讀通過Ivor Horton's "Beginning C++"。在第7章,有關於字符串初始化這個例子:使用字符串的填充構造函數與初始化程序列表

但是,您可以初始化與任意數量的指定字符的實例的字符串。你可以這樣定義並初始化一個沉睡的時間string對象:

string sleeping {6, 'z'}; 

string對象,sleeping,將包含"zzzzzz"。字符串長度將爲6.

對於我的編譯器Apple LLVM version 6.0 (clang-600.0.57),該示例不能像描述的那樣工作。相反,它的工作原理就好像想給我:

string sleeping {"\6z"}; 

使用string's "from c-string" constructor, rather than its "fill" constructor

我知道我可以用括號使用填充構造:

string sleeping(6, 'z'); 

但只是爲了滿足我的好奇心,是有什麼辦法可以使用填充構造函數與初始化列表,如書中的例子嗎?

+1

我不能相信,把它做成一本書。這是錯誤的。 – AndyG

回答

2

沒有,這是不可能的,標準specifies it

  • 如果T聚合類型 [...];
  • 否則,如果T是一個字符數組[...];
  • 如果T聚合類型 [...];
  • 否則,如果braced-init-list爲空[...];
  • 否則,T的構造都認爲,在兩個階段:
    • 稱取std::initializer_list作爲唯一的參數,或者作爲第一個參數,如果其餘的參數有默認值,所有構造進行檢查,並匹配針對類型的單個參數重載std::initializer_list

所以的std::stringconstructor接受一個std::initializer_list作爲它的第一個參數將永遠被考慮之前,需要一個計數和一個字符。

使用列表初始化與此構造將是還提供分配器的唯一方法:

std::string s{6, 'z', std::string::allocator_type{}}; 
相關問題