C++26: Constexpr Virtual Inheritance
14 hours ago
- #virtual-inheritance
- #constexpr
- #C++26
- C++11引入了constexpr,但施加了严格限制,仅允许函数中包含单条返回语句。
- C++14放宽了对constexpr的限制,允许函数中包含局部变量、循环以及多条语句。
- C++20扩展了constexpr的支持范围,纳入了动态内存分配功能,从而使得如std::string和std::vector等类型可以在常量求值中使用,并允许constexpr虚函数。
- C++23允许在constexpr函数中使用静态局部constexpr变量以及try代码块。
- C++26继续放宽constexpr规则,根据提案P3533R2,增加了对常量求值期间异常处理的支持,并移除了对虚继承的禁止。
- 虚继承通过确保基类只有一个共享实例,解决了多重继承中的菱形继承问题,但这也会增加对象的大小和复杂性。
- 在P3533R2之前,constexpr被禁止用于具有虚基类的类型的构造函数和析构函数,从而阻碍了此类继承结构在编译时的使用。
- P3533R2使得具有虚继承的类型能够拥有constexpr成员函数和对象构造能力,这有助于推动标准库组件(如std::ios_base和流)的constexpr化。
- 该提案为库的改进扫清了障碍,例如使流成为constexpr,这进而影响到<chrono>中的异常类型以及基于范围的解析等特性。
- constexpr正逐渐演变为一种简单的可选项特性,语法限制越来越少,越来越接近一种基于求值属性、任何函数都能进行常量求值的模式。