對於原始類型都是等價的,它對於用戶定義的類類型是有差別的。在這兩種情況下,執行的代碼都是相同的(在執行基本優化之後),但如果我們正在初始化的元素不是我們正在構建的類型,則對類型的要求會有所不同。
的複製初始化(T t = u;
)相當於從臨時T
類型已被隱式地從u
轉換爲t
的複製結構。另一方面,直接初始化相當於直接調用相應的構造函數。
雖然在大多數情況下,不會有任何區別,如果採取u
構造函數聲明explicit
或者如果拷貝構造無法訪問,然後複製初始化將失敗:
struct A {
explicit A(int) {}
};
struct B {
B(int) {}
private:
B(B const &);
};
int main() {
A a(1); // ok
B b(1); // ok
// A a2 = 1; // error: cannot convert from int to A
// B b2 = 1; // error: B(B const &) is not accessible
}
對於一些歷史背景,初始原始類型必須用複製初始化進行初始化。當* initializer-list *被添加到語言中以初始化類中的成員屬性時,決定使用與保持初始化程序列表中的語法統一且簡單的類相同的語法來初始化基本類型。同時允許通過複製初始化對類進行初始化,使得用戶定義的類型更接近原始類型。兩種初始化格式的區別很自然:int a = 5.0;
被處理爲從5.0
到int
的轉換,然後從int
初始化a
。用戶定義類型也是如此:T u = v;
作爲從v
到T
的轉換處理,然後從該轉換後的值中複製u
的構造。
這不是一個聲明,它的定義。溝教程和[閱讀一本體面的書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。用C++進行思考是免費的,可以從作者的頁面獲得。 –
@Cat Plus Plus:這是一個定義,但這並不意味着它不是一個聲明。 –
@JamesMcNellis:它應該是一個教程,調用定義聲明無助於擺脫兩者之間的混淆。也許我今天只是胡思亂想而已。 :+ –