不知是多少次了,我总是纠结,现在已经是2024年了,究竟应该使用C++的哪个版本。最近我看了Jason Turner的《C++ Best Practices》,其中提到了下面这句。
If you’re currently looking to move to “modern” C++, finally, please skip C++11.
C++14 fixes several holes in C++11.
我有些动摇,因为在最早一开始,2019年那会一开始学的C++98,感觉C++98足够了。而且也确实是这样,我看到的范围有限,基本上都止步于C++98那个时候,我觉得无需Modern C++,但是后来我发现我错了。
我尝试过C++11以后,才发现那些旧的东西,有些事情确实很难办。就像是,Variadic Templates(变参模板)是对于C++98无论如何也不能办到的。后来根据Jetbrain的统计(参考链接:https://www.jetbrains.com/zh-cn/lp/devecosystem-2023/cpp/),我觉得其实可以稍微激进一些,对于一些新项目尽可能选择C++17。
C++17的Structured Bindings(结构化绑定)还是挺重要的,如果没有结构化绑定,遍历一个map。比较一下C++不同标准下的写法。
#include <iostream>
#include <map>
using namespace std;
int main() {
// 创建一个map实例
map<int, string> myMap = {
{1, "One"},
{2, "Two"},
{3, "Three"},
{4, "Four"}
};
// C++98 使用迭代器遍历map
cout << "C++98 way:" << endl;
for (map<int, string>::iterator it = myMap.begin(); it != myMap.end(); ++it) {
cout << "Key: " << it->first << ", Value: " << it->second << endl;
}
// C++11 使用范围for和自动类型推导遍历map
cout << "\nC++11 way:" << endl;
for (const auto& pair : myMap) {
cout << "Key: " << pair.first << ", Value: " << pair.second << endl;
}
// C++17 使用结构化绑定和自动类型推导遍历map
cout << "\nC++17 way:" << endl;
for (const auto& [key, value] : myMap) {
cout << "Key: " << key << ", Value: " << value << endl;
}
return 0;
}
显然还是有C++17方便地的多。之所以不选择C++20,是因为编译器支持不好,还为时尚早。而且,不应该选择C++20,而是应该等待C++23完善了以后,直接过渡到C++23,这样就避免C++20中部分到C++23以后还需要修改的内容了。
总结来说,对于已有项目,尽量不动C++标准,除非已经做好决定了。新项目不应该使用C++98,而是应该选择C++17。