[英]How to use C++11 uniform initialization syntax?
我不明白何時以及如何在C ++ 11中使用新的統一初始化語法。
例如,我得到這個:
std::string a{"hello world"}; // OK
std::string b{a}; // NOT OK
為什么在第二種情況下不起作用? 錯誤是:
error: no matching function for call to ‘std::basic_string<char>::basic_string(<brace enclosed initializer list>)’
使用此版本的g ++ g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
。
對於原始數據,我應該使用什么語法?
int i = 5;
int i{5};
int i = {5};
的編譯錯誤
// T t{u};
std::string a;
std::string b{a};
是四件事的結合
草案直到不久前才說過,如果T
有一個初始化器列表構造函數( std::string
有一個采用char
元素的構造器),那么初始化器列表將作為參數傳遞給自己。 因此,構造函數的參數不是a
,而是{a}
。
草案說,初始化引用的初始化列表不是通過直接綁定來完成的,而是先從初始化列表中的元素構造一個臨時對象,然后將目標引用綁定到該臨時對象。
草案說,當通過初始化列表初始化參考時,當參考的初始化不是直接綁定時,轉換序列就是用戶定義的轉換序列。
草案說,當像上面那樣在超載解決方案中將類X
構造函數視為候選時,傳遞初始值設定項列表本身時,然后考慮“引用cv X”類型的第一個構造函數參數(cv = const /易失性)-換句話說,很可能是復制或移動構造函數,則不允許用戶定義的轉換。 否則,如果允許進行這種轉換,則始終可能會模棱兩可,因為使用列表初始化時,您不僅限於一個嵌套的用戶定義轉換。
以上所有內容的組合是,不能使用任何構造函數來使用{a}
。 一個使用initializer_list<char>
不匹配,而另一個使用string&&
和const string&
則被禁止,因為它們將需要用戶定義的轉換才能將其參數綁定到{a}
。
請注意,最近的草案更改了第一條規則:他們說,如果沒有初始化器列表構造函數可以使用初始化器列表,則參數列表將包含初始化器列表的所有元素 。 使用該更新的規則,您的示例代碼將可以正常工作。
第一個示例應該可以工作,調用復制構造函數。 如果您使用的是GCC,則該問題已在4.6中修復。
最后的示例在風格上略有不同。
int i = 5.0; // fine, stores 5
int i{5.0}; // won't compile!
int i = {5.0}; // won't compile!
不同之處在於統一的初始化語法不允許縮小轉換范圍。 在它們之間進行選擇時,您可能需要考慮這一點。
它不起作用,因為您忘記了分號:
std::string b{a};
^^^
否則,此語法就可以了,它會調用復制構造函數。
對於第二個問題,請使用int i{5};
如果要統一,盡管int i = 5;
可能更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.