2012-02-19 66 views
1

可能重複:
non-copyable objects and value initialization: g++ vs msvc
Value-initializing an automatic object?值初始化自動變量

考慮下面的語句:

這不是真的有可能值初始化自動目的。

這句話是真的嗎?我看到在這樣做沒有問題:

int main() 
{ 
    int i = int(); 
} 
+3

你'i'是複製初始化,而不是值初始化。只有臨時值被初始化。 – 2012-02-19 04:32:18

+0

[值初始化自動對象?](http://stackoverflow.com/questions/6298001/value-initializing-an-automatic-object)和http://stackoverflow.com/questions/2671532/non -copyable-objects-and-value-initialization-g-vs-msvc – 2012-02-19 04:52:29

回答

3

術語value-initialization定義在8.5 [dcl.init]段16,第四子彈:

如果初始化爲(),對象是值-initialized。

也就是說,一個自動變量的值初始化是這樣的:

int i(); 

然而,這是一個名爲i函數返回一個int的聲明。因此,不可能對自動值進行初始化。在你的例子中,臨時值是初始化值,自動變量是複製初始化的。您可以驗證這確實需要拷貝構造函數使用不具有可訪問的拷貝構造函數測試類可訪問:

class noncopyable { 
    noncopyable(noncopyable const&); 
public: 
    noncopyable(); 
}; 

int main() { 
    noncopyable i = noncopyable(); // ERROR: not copyable 
} 
+0

:is int i(6)一個值的初始化和int(i)(int())的意思是 – 2012-02-19 05:28:46

+0

爲什麼這是值初始化? T * p2 = new T(); – 2012-02-19 05:34:53

+0

「int i(6)」形式是_direct-initialization_(8.5 [dcl.init]第15段)。 'int i(int())'聲明瞭一個名爲'i'的函數,它返回一個'int'並接受一個沒有參數的函數並且返回'int'作爲參數。在'T * p2 = new T()'中,'new'ed對象被初始化,指針'p2'被複制初始化。 – 2012-02-19 08:31:53