关于C++版本的思考

不知是多少次了,我总是纠结,现在已经是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。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值