2012-02-19 11 views
1

可能性の重複:
non-copyable objects and value initialization: g++ vs msvc
Value-initializing an automatic object?値の初期化

次の文考えてみましょう:

をそれは本当に不可能です自動の値初期化へオブジェクト。

このステートメントは正しいですか?

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

あなた 'i'がコピー初期化され、値ではなく、初期化されます。テンポラリのみが値で初期化されます。 –

+0

[自動オブジェクトの値を初期化するかどうか?](http://stackoverflow.com/questions/6298001/value-initializing-an-automatic-object)とhttp://stackoverflow.com/questions/2671532/non - コピー可能オブジェクトと値の初期化-g-vs-msvc –

答えて

3

用語value-initialization 8.5 [dcl.init]第16項、第四箇条書きで定義されていない:私はこれを行うには問題が参照)(初期化子がある場合

、オブジェクトが値であり、初期化されました。

すなわち、自動変数の値を初期化は次のようになり:

int i(); 

しかし、これはintを返すi呼び出される関数の宣言です。したがって、自動化をバリュー初期化することは不可能です。あなたの例では、一時変数は値で初期化され、自動変数はコピーで初期化されます。あなたは、これは確かにアクセス可能コピーコンストラクタを持っていないテストクラスを使用してアクセスできるようにコピーコンストラクタが必要であることを確認することができます。

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

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

:int i(6)値の初期化とint i(int())の意味は –

+0

を意味します。 T * p2 = new T(); –

+0

形式 'int i(6)'は_direct-initialization_(8.5 [dcl.init]パラグラフ15)です。 'int i(int())'は 'int'を返す' i'という関数を宣言し、引数を持たない関数をとり、 'int'を引数として返します。 'T * p2 = new T()'では 'new'オブジェクトが値で初期化され、ポインタ' p2'はコピー初期化されます。 –