gpt4 book ai didi

c++ - 支持空初始化列表的高效对象构造

转载 作者:太空宇宙 更新时间:2023-11-04 16:12:10 24 4
gpt4 key购买 nike

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

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>{} );

?

最佳答案

不清楚为什么添加默认构造函数不适合您,只需允许 S s{}:

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

如果那不合适,您有多种选择。最明显的是摆脱你的移动构造函数,所以这个类是一个聚合。无论如何,您展示的移动构造函数毫无意义,它不会做任何隐式定义的构造函数不会做的事情。

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;
};

这将允许您将 braced-init-list 传递给 vector 成员。

如果您只想将空的初始化列表传递给 vector ,另一种选择是重载构造函数,以便将某些内容传递给 vector 是可选的(但您仍然可以为其他成员传递参数)。这意味着您只需省略 vector 的无意义的 {} 参数,让它默认构造。

关于c++ - 支持空初始化列表的高效对象构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27399412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com