我觉得很奇怪,尽管默认构造函数是 private
(4.8.1 g++),但以下程序仍然可以正常编译:
class A{
private:
A() = default;
A(const A&) = default;
};
int main(){
A a;
}
其实从标准(N3242)的8.4.2[2]开始
An explicitly-defaulted function may be declared constexpr only if it would have been implicitly declared as constexpr. If it is explicitly defaulted on its first declaration,
— it shall be public,
..........
默认说明符忽略访问说明的具体目的是什么?我觉得这可能会导致类设计器不希望用户创建默认值但在实现中需要默认构造函数的接口(interface)问题。我想这可能是因为默认构造函数通常是 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
。
最佳答案
这是一个 gcc 错误。 Bug 57913包含一个几乎与您相同的示例。 Bug 56429包含几个相关错误报告的链接,其中 bug 54812已在 gcc 4.9 中修复,确实拒绝了您的代码。
error: 'constexpr A::A()' is private
关于c++ - =默认忽略访问说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33180114/