删除类的复制构造函数时初始化类的数组成员
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.agr],重点是我的):
当聚合由初始化器列表初始化时,[…]初始化器列表的元素被视为聚合[…]成员的初始化器。
在您的情况下,这意味着Foo_typedef(2,3)
将被视为Foo_typedef
的初始值设定项,因此需要一个副本。在我给出的代码中,{2, 3}
将被视为初始值设定项,并调用相应的构造函数(无副本)。
相关文章:
- 为什么我无法访问指向数组中成员函数的指针?
- 如何将结构/联合数组的成员传递到函数中
- 使用带有参数包的数组的成员数组初始化类
- 有没有办法给数组的成员指定不同的名称?
- 使用包含结构的数组的成员函数
- C++:释放动态数组(结构成员)和指向此结构的指针的方法
- C 用数组作为成员创建对象
- 用另一个 constexpr 数组对成员数组进行大括号初始化
- 来自数组的成员和比特菲尔德的结构
- 如何创建指向数组类成员的指针?
- 将数组的成员设置为零
- "Empty"数组\向量成员 C++
- 功能指针数组(包括成员功能)投掷模板专业化错误
- 另一个结构内部的结构数组的成员变量没有通过引用传递
- 正确转换 2D 数组的成员变量
- 常量数组类成员初始化
- 为具有对象或对象数组作为成员的类运行不同的代码
- C++ 如何指向数组的成员
- 将包含数组数据成员的结构保存到文件
- 数组类成员初始化(C++)