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

雷克

这是我正在使用的用例的较小版本。

#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后,将发出以下错误。

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],重点是我的):

初始化程序列表初始化聚合时,初始化程序列表的元素将用作聚合成员的初始化程序。daccess -ods.un.org daccess-ods.un.org

在您的情况下,这意味着Foo_typedef(2,3)它将被用作初始化程序Foo_typedef,因此将需要一个副本。在我给出的代码中,{2, 3}将被用作初始化程序,并将调用相应的构造函数(无副本)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过基类构造函数从驱动类模板值初始化基类数组成员变量

继承:构造函数,在C ++ 11中初始化C之类的基类的数组成员

在可变参数模板类的构造函数中初始化元组成员

为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

为什么需要在constexpr类中成员初始化非静态数组成员?

使用复制构造函数时,是否在复制构造函数之前初始化了类数据成员?

没有默认构造函数和已删除副本构造函数初始化的对象的类成员数组

在类模板中使用条件运算符初始化静态constexpr char数组成员

需要移动构造函数,但未使用,在数组初始化中使用已删除复制构造函数的类元素

如果基类包含数组成员,则派生类的构造函数不能为constexpr

初始化固定的C数组成员结构

弹性数组成员的非静态初始化?

灵活数组成员的静态初始化

数组成员的初始化程序无效

C++在初始化类实例时隐式调用类成员的构造函数

如何通过引用初始化函数内部的结构数组成员

在编译时初始化灵活的数组成员

构造函数未初始化嵌套类的成员

在构造函数中初始化类成员变量

Clang-Tidy:移动构造函数通过调用复制构造函数来初始化类成员

将参数传递给基类构造函数时成员的初始化

初始化列表中的零初始化数组成员

初始化禁止复制的成员类

Arduino类数组成员

综合默认构造函数如何初始化已初始化的类成员?

javascript类构造函数初始化数组

如何使用已删除的副本构造函数初始化类数组(C ++ 11)

使用非静态数据成员的类内初始化和嵌套类构造函数时出错

在类声明或构造函数初始化器列表中初始化简单成员