Con*_*tor 5 c++ constructor language-lawyer constexpr c++14
以下代码可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
编译器的这种行为是否符合标准?请注意,将任何成员(如int i;)添加到Foo类都不会改变任何内容。
是的。编译器生成的默认构造函数和普通构造函数
Foo() = default;
Run Code Online (Sandbox Code Playgroud)
constexpr bool b = Foo{};假设所有类成员都可以构造,两者都使您能够编写constexpr。请注意,如果您写了
Foo(){}
Run Code Online (Sandbox Code Playgroud)
那么就不会constexpr被允许。(与提供空主体的构造函数之间的一个重要区别。)default