删除类的复制构造函数时初始化类的数组成员

Initialize an array member of class when class's copy constructor is deleted

本文关键字:数组 组成员 初始化 构造函数 复制 删除      更新时间:2023-10-16

这是我正在处理的一个用例的较小版本。

#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}将被视为初始值设定项,并调用相应的构造函数(无副本)。