【发布时间】:2019-08-07 08:10:52
【问题描述】:
sn-p简化代码为:
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;
}
另请参阅我的live example(显示不同编译器的行为)。
最后,我想知道为什么 auto a = A::create(); 使用较新的编译器 [gcc >= 7.1](C++17 标准的哪一部分与此处相关?)编译时不会出错,因为:
- 我们有一个不可复制的成员
NonCopyable n;,因此默认的复制构造函数格式不正确。 - 这里是 NRVO,因为
A a; return a;所以标准不保证复制省略。 - 移动构造函数
A(A&&)被标记为私有。 - 优化已关闭
-O0进行测试。
我的怀疑是编译器正在“验证”移动构造函数return a;;因为这是A 的成员函数,所以它通过了验证。即使怀疑是正确的,我也不确定这是否符合标准。
【问题讨论】: