2016-05-18 4 views
0

ここでは、私が取り組んでいるより小さなバージョンのユースケースです。クラスのコピーコンストラクタが削除されたときに、クラスの配列メンバーを初期化する

#include <mutex> 
template<typename T = float> 
class Foo 
{ 
public: 
    Foo(int x, int y):m_mutex(){} 
private: 
    std::mutex m_mutex; // This is must have in my project 
}; 

typedef Foo<float> Foo_typedef; 

class Func 
{ 
public:  
    static Foo_typedef static_array[2]; 
}; 

Foo_typedef Func::static_array[2] = { Foo_typedef(2,3), Foo_typedef(2,3) }; 

int main() 
{ 
    return 0; 
} 

このVS 2015 Update 2をコンパイルすると、次のエラーが発生します。

私は周りを見回し、2つの理由の1つがあるかもしれないと考えました。 std::mutexため

1)コピーコンストラクタメンバーは

2)私は、私が見ていたものと似ているかもしれないと思ったThisが削除されます。

どれですか? VS 2015 Update 2コンパイラによってスローされたこのエラーを回避するにはどうすればよいですか?

UPDATEFoo_typedefに渡す必要があるいくつかのパラメータを取り込むコンストラクタが更新されました。

+1

イニシャライザを削除するだけでいいですか? 'Foo_typedef Func :: static_array [2];' –

+0

'Foo_typedef Func :: static_array [2] {};' –

答えて

4

あなたは、コンストラクタを使用して所定の位置に要素を構築する必要があります:二つの要素は場所にを構築しているので、これにより

Foo_typedef Func::static_array[2] = { {2, 3}, {2, 3} }; 

、何のコピーや移動はありません。

標準は(§ 8.5.1/2 [dcl.init.aggr]、強調は私です)言う:

集合体が初期化リストで初期化されると、[...]の要素の初期化子は [...]のメンバーのためのイニシャライザとなります。あなたのケースでは

、それはFoo_typedef(2,3)があなたのFoo_typedefため初期化子とさせていただきますので、コピーが必要とされることを意味します。私が与えたコードでは、{2, 3}の初期化子と解釈され、対応するコンストラクタが呼び出されます(コピーなし)。

関連する問題