当前位置: 首页 > 知识库问答 >
问题:

支持空初始值设定项列表的高效对象构造

殷学
2023-03-14

我有一个这样的类,除了有多个成员:

struct S {
    S( S&& s ) : member( std::move( s.member ) ) {}
    std::vector< int > member;
};

我基本上希望对其进行聚合初始化,如下所示:

S s{ {} };

但由于自定义构造函数的原因,这似乎是不可能的,因此我想使用构造函数参数来模拟它:

struct S {
    S( S&& s ) : member( std::move( s.member ) ) {}
    S( std::vector< int >&& vec ) : member( std::move( vec ) ) {}
    S( const std::vector< int >& vec ) : member( vec ) {}
    std::vector< int > member;
};

这看起来有很多冗余,只是为了在可能的情况下移动和复制,尤其是在成员数量激增的情况下。我想我想要完美的转发?

struct S {
    template< typename V >
    S( V&& vec ) : member( std::forward< V >( vec ) ) {}
    S( S&& s ) : member( std::move( s.member ) ) {}
    std::vector< int > member;
};

但是现在我不能像这样使用空的初始化列表调用它:

S s( {} );

因为无法推导出初始化列表参数类型。有没有不需要我写的解决方案

S s( std::vector<int>{} );

共有1个答案

东郭子默
2023-03-14

不清楚为什么添加默认构造函数不是您的选项,只允许S{}

struct S {
    S() = default;
    S( S&& s ) = default;
    std::vector< int > member;
};

如果这不合适,你有很多选择。最明显的是去掉move构造函数,因此该类是一个聚合。您显示的移动构造函数无论如何都是毫无意义的,它不会做任何隐式定义的构造函数不会做的事情。

struct S {
    std::vector< int > member;
};

下一个选项是添加初始值设定项列表构造函数:

struct S {
    S() = default;
    S( S&& s ) = default;
    S(std::initializer_list<int> il) : member(il) { }
    std::vector< int > member;
};

这将允许您将带括号的init列表传递给向量成员。

如果您只想向向量传递一个空的初始值设定项列表,另一个选项是重载构造函数,以便向向量传递某些内容是可选的(但您仍然可以为其他成员传递参数)。这意味着您只需省略向量的无意义参数,并将其默认构造。

 类似资料:
  • 我相信现代C初始值设定项列表对于初始化对象非常有用,甚至不需要定义自己的构造函数: 但是,当我的类从另一个类继承时,这不起作用: 我尝试添加

  • 我一直避免像下面这样的初始化 因为引用和指针限定符不适用于初始化。假设这是初学者学习的第一件事,与之相关的模糊性让我觉得下面的内容更清晰,也更不需要读者思考 有了C17和结构化绑定,我很开心,看到了很多潜力。C17禁止了C14和C11未能修复的东西,是一个而不是

  • 我有以下代码: 我希望输出是:“base constructor,test:50”,但事实并非如此,因为构造函数是在初始化之前调用的,没有错误或警告,它只是编译。 有什么方法可以让构造函数在之后被调用吗?或者这是总体上的糟糕设计? 我正在尝试将所有的init方法和它们的调用放入构造函数insted中,这个行为阻止了我这样做。

  • 所以我正在学习构造函数初始值设定项列表,我写了以下代码: 为此我使用了g编译器。它调用的是构造函数而不是复制构造函数。它应该调用复制构造函数,因为我正在创建一个对象来创建另一个对象?这里的问题是什么,标准对此怎么说?

  • 使用C#对象初始化器有什么好处吗? 在C语言中,没有引用,所有内容都封装在一个对象中,因此在创建对象后使用它们而不是初始化成员是有意义的。 在C#中使用它们的情况是什么? 如何:使用对象初始值设定项初始化对象(C#编程指南)

  • 我通过解决一些黑客等级问题来学习java。下面的代码是关于学习静态初始值设定项块的。例外情况是thown和Capture,但程序仍在运行,我不确定原因。 输入:-1,2 预期输出:java.lang.例外:宽度和高度必须为正 实际输出:宽度和高度必须为正-2