下面的代码在 clang 7+ 中编译通过,但在 c++17 和 c++14 的 clang 5 和 6 中不编译通过。
对于 clang 5 和 6,问题似乎是隐式复制构造函数从可变成员 x 中读取了值。
请问是否整个构造是符合标准的(c++17),或者程序是非法的?或者隐式复制构造函数有关于标准的变化,这些变化在较早版本的clang中可能没有实现?
请问是否整个构造是符合标准的(c++17),或者程序是非法的?或者隐式复制构造函数有关于标准的变化,这些变化在较早版本的clang中可能没有实现?
struct Foo {
int a;
mutable int x{};
constexpr Foo() : a(0) {}
//constexpr Foo(const Foo& other) : a(other.a) {} // <- with this line it works on Clang 5 & 6, too
};
struct FooFactory {
static constexpr auto create() {
auto f = Foo{};
return f;
}
};
int main() {
constexpr Foo f = FooFactory::create();
++f.x;
}
可以在这里实时查看代码。