首页 > 解决方案 > 编译器默认生成构造函数 constexpr 吗?

问题描述

以下代码使用clang++ 3.8.0g++ 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不会改变任何东西

标签: c++constructorc++14language-lawyerconstexpr

解决方案


是的,隐式构造函数是 constexpr 这种情况。通常,它取决于子对象。

[class.ctor]

一个默认且未定义为已删除的默认构造函数在被 odr 使用 (6.2) 创建其类类型 (4.5) 的对象时或在其第一次声明后显式默认时被隐式定义。隐式定义的默认构造函数执行类的一组初始化,这些初始化将由用户编写的该类的默认构造函数执行,没有 ctor-initializer (15.6.2) 和空的复合语句。如果该用户编写的默认构造函数格式不正确,则程序格式错误。如果该用户编写的默认构造函数满足 constexpr 构造函数 (10.1.5) 的要求,则隐式定义的默认构造函数是 constexpr。... [剪辑]

constexpr 构造函数的相关要求:

[dcl.constexpr]

  • 该类不应有任何虚拟基类;
  • 对于非委托构造函数,选择用于初始化非静态数据成员和基类子对象的每个构造函数都应为 constexpr 构造函数;

推荐阅读