【发布时间】:2016-01-15 18:36:29
【问题描述】:
尽管默认构造函数是 private (4.8.1 g++),但以下程序仍然编译得很好,我觉得很奇怪:
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
}
其实从标准(N3242)的8.4.2[2]开始
只有当它被隐式声明为 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。
【问题讨论】:
标签: c++ c++11 constructor defaulted-functions