C-like,構造函數和統一初始化之間有什么區別?據我所知,有三種方法可以在C ++中初始化變量。int x = 0; // C-like initializationint x (0); // Constructor initializationint x {0}; // Uniform initialization為C ++ 11引入了統一初始化,以便為初始化不同類型的變量提供更加統一的語法,這需要在C ++ 03中使用不同的語法。C-like,構造函數和統一初始化之間有什么區別?我應該總是使用統一初始化嗎?
2 回答

寶慕林4294392
TA貢獻2021條經驗 獲得超8個贊
c-like,構造函數和統一初始化之間有什么區別?
對于原始類型int,沒有實際的區別; 所以讓我們考慮一個類類型T。
第一種風格相當于
T x(T(0));
從初始化表達式創建臨時對象,然后x通過移動或復制它來初始化。在實踐中,移動或復制將被省略,因此結果與第二種風格相同; 唯一的區別是,如果沒有可訪問的副本或移動構造函數,第一個將失敗。
第二個使用帶有一個參數的構造函數直接初始化對象,如果沒有合適的構造函數則給出錯誤。
第三個取決于可用的構造函數。
如果有一個構造函數std::initializer_list,它會使用它;
否則,如果有一個構造函數采用合適類型的單個參數,它會使用它;
否則,如果它是具有一個成員的聚合(沒有構造函數),則該成員初始化為零;
否則,這是一個錯誤。
我應該總是使用統一初始化嗎?
沒有。有時您需要函數式初始化來區分initializer_list構造函數和采用其他參數類型的構造函數。例如:
std::vector<int> v1(10, 42); // 10 elements with value 42
std::vector<int> v2{10, 42}; // 2 elements with values 10 and 42
你也不應該稱它為“統一初始化”,因為它在任何有意義的意義上都不是“統一的”。官方術語是“支撐初始化”。
- 2 回答
- 0 關注
- 727 瀏覽
添加回答
舉報
0/150
提交
取消