doo*_*sta 5 c++ constructor initializer-list c++11
考虑以下代码:
#include <iostream>
#include <vector>
struct C {
std::vector<int> a;
std::string b;
bool c;
};
void printC(const C &c) {
// ...
}
int main() {
printC({
{ 1, 2, 3 },
"ehlo",
false
});
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为编译器可以为我生成适当的构造函数.但是,如果我将struct C更改为:
struct C {
std::vector<int> a;
std::string b;
bool c;
C() {
c = false;
}
};
Run Code Online (Sandbox Code Playgroud)
printC调用停止工作,因为编译器停止生成适当的构造函数.我试过用std :: initializer_list写自己的构造函数但是失败了.
所以问题是 - 如何编写构造函数,使上面的代码再次编译和工作?
我试过用std :: initializer_list写自己的构造函数但是失败了.
你不需要一个.你只需要一个带矢量,字符串和布尔值的c'tor:
C(std::vector<int> a, std::string b, bool c)
: a(std::move(a))
, b(std::move(b))
, c(c) {
}
Run Code Online (Sandbox Code Playgroud)
您的代码现在应该再次构建良好.虽然现在它会产生两个移动操作,而原始聚合版本可以直接初始化对象的元素.这是值得考虑的事情.
值得注意的是,在C++ 14及更高版本中,您只需使用默认成员初始值设定项:
struct C {
std::vector<int> a;
std::string b;
bool c = false;
};
Run Code Online (Sandbox Code Playgroud)
此外,聚合初始化不会生成构造函数.它完全绕过它们.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |