cpp17的初始化列表
时间: 2023-10-29 09:02:14 浏览: 116
C++17的初始化列表没有明显的变化,它仍然是在构造函数中使用花括号括起来的一组值,用于初始化类的成员变量。例如:
```c++
class MyClass {
public:
MyClass(int a, int b, int c) : x(a), y(b), z(c) {}
private:
int x, y, z;
};
MyClass obj{1, 2, 3}; // 使用初始化列表初始化MyClass对象
```
在上面的例子中,构造函数使用初始化列表将参数a、b和c分别赋值给类的成员变量x、y和z。在创建MyClass对象时,使用花括号括起来的一组值来初始化它。
C++17没有引入新的初始化列表语法或语义,但它增加了一些支持类模板参数推断和复合类型的变化。例如:
```c++
template <typename T>
class MyClass {
public:
MyClass(T a, T b, T c) : x(a), y(b), z(c) {}
private:
T x, y, z;
};
MyClass obj{1, 2, 3}; // 类模板参数T被推断为int类型
```
在上面的例子中,MyClass是一个类模板,它接受一个类型参数T。使用初始化列表初始化MyClass对象时,编译器可以通过对象的类型推断出T的类型为int。因此,可以使用简化的语法来初始化MyClass对象,而无需指定T的类型。
除此之外,C++17还增加了对复合类型的初始化列表支持,例如std::array、std::pair和std::tuple。例如:
```c++
std::array<int, 3> arr{1, 2, 3}; // 使用初始化列表初始化std::array对象
std::pair<int, std::string> p{1, "hello"}; // 使用初始化列表初始化std::pair对象
std::tuple<int, double, std::string> t{1, 3.14, "hello"}; // 使用初始化列表初始化std::tuple对象
```
在上面的例子中,使用初始化列表初始化了std::array、std::pair和std::tuple对象。这些复合类型都支持使用初始化列表来初始化它们的元素。
阅读全文