默认情况下,编译器是否生成构造函数constexpr?

Con*_*tor 5 c++ constructor language-lawyer constexpr c++14

以下代码可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

编译器的这种行为是否符合标准?请注意,将任何成员(如int i;)添加到Foo都不会改变任何内容

Bat*_*eba 1

是的。编译器生成的默认构造函数和普通构造函数

Foo() = default;
Run Code Online (Sandbox Code Playgroud)

constexpr bool b = Foo{};假设所有类成员都可以构造,两者都使您能够编写constexpr。请注意,如果您写了

Foo(){}
Run Code Online (Sandbox Code Playgroud)

那么就不会constexpr被允许。(与提供空主体的构造函数之间的一个重要区别。)default