簡體   English   中英

如何使用C ++ 11統一初始化語法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM