c++ - 编译器默认生成构造函数 constexpr 吗?
问题描述
以下代码使用clang++ 3.8.0和g++ 7.2.0成功编译(编译标志为):-std=c++14 -Wall -Wextra -Werror -pedantic-errors
struct Foo
{
constexpr operator bool() const
{
return false;
}
};
int main()
{
constexpr bool b = Foo{};
(void)b;
}
编译器标准的这种行为是否符合?请注意,将任何成员(如int i;
)添加到Foo
类不会改变任何东西。
解决方案
是的,隐式构造函数是 constexpr 这种情况。通常,它取决于子对象。
[class.ctor]
一个默认且未定义为已删除的默认构造函数在被 odr 使用 (6.2) 创建其类类型 (4.5) 的对象时或在其第一次声明后显式默认时被隐式定义。隐式定义的默认构造函数执行类的一组初始化,这些初始化将由用户编写的该类的默认构造函数执行,没有 ctor-initializer (15.6.2) 和空的复合语句。如果该用户编写的默认构造函数格式不正确,则程序格式错误。如果该用户编写的默认构造函数满足 constexpr 构造函数 (10.1.5) 的要求,则隐式定义的默认构造函数是 constexpr。... [剪辑]
constexpr 构造函数的相关要求:
[dcl.constexpr]
- 该类不应有任何虚拟基类;
- 对于非委托构造函数,选择用于初始化非静态数据成员和基类子对象的每个构造函数都应为 constexpr 构造函数;
推荐阅读
- javascript - react redux中的地图字典中的if语句
- python - 有没有办法可以在“if”语句中插入链接?
- python - How to convert FEN ID onto a Chess Board?
- reactjs - 即使未显示,字段仍会发布
- html - 防止浏览器文本输入建议 2021 chrome 版本 88.0.4324.190
- javascript - 如何使用 Jest 模拟返回响应对象的方法
- python - 当 break 应该用于定义函数时,如何中断 while 循环?
- .net - 如何计算 AutoScaleMode.Font 中的比例因子?
- javascript - 获取编码字符作为响应
- ssl - 从 GKE pod 连接到 GCP redis 内存存储