【发布时间】:2018-10-01 19:12:23
【问题描述】:
在本视频的最后(从 15:57 开始)有关于如何在 C++17 中使用几乎统一的初始化的建议:video here
要点是这样的:始终使用直接初始化auto a{...}; 和MyType a{...};
不要为您的类型使用复制初始化= {...}。
#include <iostream>
struct MyType {
explicit MyType(std::initializer_list<int>) {
std::cout << "Called std::initializer_list<int>" << std::endl;
}
explicit MyType(int) {
std::cout << "Called int." << std::endl;
}
MyType(int, int, int) {
std::cout << "Called int, int, int" << std::endl;
}
};
int main() {
MyType calls_init_list{10}; //Calls initializer_list<int>
MyType calls_init_list_2{10, 20}; //Calls initializer_list<int>
MyType calls_init_list_3{10, 20, 30}; //Calls initializer_list<int>
MyType compile_error = {10, 20, 30}; //Compile error
}
如果我从第一个构造函数中删除显式,它也会使用initializer_list<int> 调用第四个调用
- 我需要进行哪些更改才能按照视频中的规则呼叫
(int)和(int, int, int)? - 是否可以在初始化列表构造函数存在的情况下调用其他构造函数?
- 有什么设计建议可以避免放弃视频中建议的一般规则吗?终于有一些有意义的东西会很好,C++ 初始化可能是其中最糟糕的部分。
【问题讨论】:
标签: c++ c++17 initializer-list