我发现很奇怪,尽管默认构造函数为private
(4.8.1 g ++),但以下程序仍然编译良好:
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
}
实际上是从标准的8.4.2 [2](N3242)
显式默认函数只有在被隐式声明为constexpr的情况下才可以声明为constexpr。如果在第一次声明中明确违约,
- 它应该公开,
..........
默认说明符忽略访问规范的目的究竟是什么?我觉得这可能会导致类设计者无法使用界面问题,因为他们不希望用户创建默认值但需要实现中的默认构造函数。我认为可能是因为默认构造函数通常是public
,因此default
旨在复制它 - 但这并不能解答复制原因=default
的原因构造函数不会忽略private
规范。
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
A b(a); //error: constexpr A::A(const A&) is private
}
实际上我无法从标准中看到它明确默认的copy/move
构造函数/赋值不是public
。