在 C 20 中,對于這樣的型別:
struct Person {
std::string name;
int age;
};
我們可以使用聚合初始化從函式中回傳它,無論是否寫出型別名稱:
Person getJohn()
{
// With type name
return Person {
.name = "John",
.age = 42,
};
// Without type name
return {
.name = "John",
.age = 42,
};
}
明確指定和不指定型別名稱有什么區別?我注意到的一件事是,如果沒有型別名稱,如果我弄亂了欄位名稱/順序,我的編譯器和 IDE 給出的錯誤訊息就沒有型別名稱那么清晰。但除此之外,這兩種形式在語意上有什么不同嗎?
uj5u.com熱心網友回復:
它們應該始終是等價的。return陳述句執行復制初始化 ( [ stmt.return]/2 )。來自指定初始化器串列的復制初始化執行聚合初始化 ( [dcl.init.list]/3.1 )。如果運算元只是指定初始化器串列本身,我們就完成了。回傳物件已聚合初始化。如果運算元是Person 指定初始化器串列,則保證復制省略適用([dcl.init.general]/16.6.1),這再次意味著回傳物件只是聚合初始化(沒有額外的臨時物件)。
省略型別只能在非聚合初始化背景關系中產生影響:如果已宣告為初始化選擇的用戶定義建構式explicit,則程式格式錯誤。但是聚合初始化不使用建構式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/417719.html
標籤:
