c++ - 使用已删除的复制构造函数和初始化列表重载调用类定义中的成员构造函数

标签 c++ c++11 initialization

struct Foo
{
    Foo(const Foo&) = delete;
    Foo(int a, int b);
    Foo(std::initializer_list<int>);    
};

struct Bar
{
    Foo f = Foo(1, 2);
    // Foo f = {1, 2} - calls the initializer_list overload
};

如果删除了复制构造函数,如何用两个 int 初始化 Foo?

最佳答案

为了使初始化工作,所讨论的类型必须是 MoveConstructible *。在您的特定情况下,提供移动构造函数可以满足此要求:

Foo(Foo&&) = default;

如果这不是一个选项,您可以在默认构造函数中初始化该成员,并将其用作其他构造函数中的委托(delegate)构造函数。

struct Bar
{
    Bar() : f(1, 2) {}
    Bar(const FooBar&) : Bar() {}
    Bar(double x) : Bar() {}
    Foo f;
};

* 这并不意味着将进行复制。 T t = T() 很容易成为复制省略的候选者。但是,可行的构造函数必须是可访问的。

关于c++ - 使用已删除的复制构造函数和初始化列表重载调用类定义中的成员构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174271/

相关文章:

c++ - 为什么一个 C++ MFC "empty"项目占用 142MB 而一个 6MB 的可执行文件? ( Visual Studio 2010)

c++ - 可以使用模板在 C++ 中按名称访问位字段成员吗?

Java数组没有保持初始化

c - 警告 : missing braces around initializer [-Wmissing-braces] (IN MACRO)

c++ - 关于C++对象布局中 "this pointer adjustor"的问题

c++ - transient 复制构造函数怪异

c++ - 如何在 Win32 应用程序中填充文件夹浏览器

C++:memcpy 是基于 POD 的子对象 UB 吗?

c++ - 将右值作为右值转发是用例吗?

mongodb - 如何在 NextJS 启动时初始化 Mongodb