现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
36303 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

48 | 显式对象参数、const 视图、expected 和 mdspan:C++23 的一些重要改进

你好,我是吴咏炜。
第 46 讲里我讨论了 C++20 的一些重要改进。类似地,本讲我来讨论一下 C++23 里可以快速上手的重要特性。

显式对象参数

传统上,类的非静态成员函数都有一个隐式传递的 this 参数。正因为有这个隐式的参数,我们才能访问非静态数据成员。比如,optional 的实现里多半有类似下面的代码:
template <typename T>
class optional {
public:
// …
constexpr T&
operator*() & noexcept
{
return value_;
}
// …
private:
union {
char dummy_;
T value_;
};
bool engaged_{};
};
在这里,operator* 的实现可以理解为:
constexpr T&
operator*(optional* this) & noexcept
{
return this->value_;
}
也就是说,通过 this 指针去访问 value_ 这样的数据成员。
不好玩的是,由于 optional 可以是 const,也可以是右值,我们需要把这个 operator* 的实现重复四遍。这就有点无聊了:
constexpr T&
operator*() & noexcept
{
return value_;
}
constexpr const T&
operator*() const& noexcept
{
return value_;
}
constexpr T&&
operator*() && noexcept
{
return std::move(value_);
}
constexpr const T&&
operator*() const&& noexcept
{
return std::move(value_);
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. C++23引入了显式对象参数和可递归的lambda表达式,简化了代码编写,提高了代码的可读性和可维护性。 2. 显式对象参数的使用需要注意const传递问题,可以使用一些技巧将const性传递到成员变量上,例如使用propagate_const或编写辅助函数。 3. C++23中的expected成为了标准库的一部分,引入了“单子”成员函数来简化一些惯用法的表达,使得错误处理更加优雅和灵活。 4. 使用expected时一般会搭配std::error_code,而不是像之前的例子一样使用string,同时,错误检查部分也得到了优化,使得代码更加简洁和易读。 5. C++23引入了多维下标和mdspan,使得多维数据的下标表示更加方便和自然,同时提供了灵活的布局策略和访问策略,增强了对多维数据的操作和管理能力。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部