简化的代码片段是:
class A {
public:
~A();
static A create();
private:
A() = default;
A(A&&) = default;
NonCopyable n;
};
A A::create() {
A a;
return a;
}
int main(int argc, char* argv[]) {
auto a = A::create();
return 0;
}
另请参阅我的实时示例(显示不同编译器的行为)。
最后,我想知道为什么auto a = A::create();
使用较新的编译器 [gcc >= 7.1] 编译没有错误(C++17 标准的哪一部分与这里相关?),因为:
- 我们有一个不可复制的成员
NonCopyable n;
,因此默认的复制构造函数格式不正确。 - 这是一个 NRVO,因为
A a; return a;
标准不保证复制省略。 - 移动构造函数
A(A&&)
被标记为私有。 - 优化已关闭
-O0
以进行测试。
我的怀疑是编译器正在“验证”移动构造函数return a;
;因为这是它的成员函数,A
所以它通过了验证。即使怀疑是正确的,我也不确定这是否符合标准。