我有一个这样的类,除了有多个成员:
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{}
:
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