当class的复制构造函数被删除时初始化class的一个数组成员
Initialize an array member of class when class's copy constructor is deleted
这是我正在处理的用例的较小版本。
#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 更新 2 后发出以下错误。
error C2280: 'Foo<float>::Foo(const Foo<float> &)': attempting to reference a deleted function
note: see declaration of 'Foo<float>::Foo'
我环顾四周,我怀疑这可能是两个原因之一。
1) std::mutex
的复制构造函数成员被删除
2) 我认为这可能与我所看到的相似。
是哪一个?我该怎么做才能绕过 VS 2015 Update 2 编译器抛出的这个错误?
UPDATE:更新了构造函数,它接收一些需要传递给 Foo_typedef
.
的参数
您需要使用构造函数就地构造元素:
Foo_typedef Func::static_array[2] = { {2, 3}, {2, 3} };
有了这个,就没有复制或移动,因为这两个元素是就地构造的。
标准说(§8.5.1/2 [dcl.init.aggr],重点是我的):
When an aggregate is initialized by an initializer list, [...] the elements of the initializer list are taken as initializers for the members of the aggregate [...].
在您的情况下,这意味着 Foo_typedef(2,3)
将被视为您的 Foo_typedef
的 initializer,因此需要一个副本。在我给出的代码中,{2, 3}
将被视为 初始化程序 并调用相应的构造函数(无副本)。
这是我正在处理的用例的较小版本。
#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 更新 2 后发出以下错误。
error C2280: 'Foo<float>::Foo(const Foo<float> &)': attempting to reference a deleted function
note: see declaration of 'Foo<float>::Foo'
我环顾四周,我怀疑这可能是两个原因之一。
1) std::mutex
的复制构造函数成员被删除
2)
是哪一个?我该怎么做才能绕过 VS 2015 Update 2 编译器抛出的这个错误?
UPDATE:更新了构造函数,它接收一些需要传递给 Foo_typedef
.
您需要使用构造函数就地构造元素:
Foo_typedef Func::static_array[2] = { {2, 3}, {2, 3} };
有了这个,就没有复制或移动,因为这两个元素是就地构造的。
标准说(§8.5.1/2 [dcl.init.aggr],重点是我的):
When an aggregate is initialized by an initializer list, [...] the elements of the initializer list are taken as initializers for the members of the aggregate [...].
在您的情况下,这意味着 Foo_typedef(2,3)
将被视为您的 Foo_typedef
的 initializer,因此需要一个副本。在我给出的代码中,{2, 3}
将被视为 初始化程序 并调用相应的构造函数(无副本)。