=默认忽略访问说明符?

时间:2015-10-16 21:52:16

标签: c++ c++11 constructor defaulted-functions

我发现很奇怪,尽管默认构造函数为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

1 个答案:

答案 0 :(得分:15)

这是一个gcc错误。 Bug 57913包含与您的示例几乎完全相同的示例。 Bug 56429包含几个相关错误报告的链接,其中bug 54812已在gcc 4.9中修复,这确实会拒绝您的代码。

error: 'constexpr A::A()' is private

Live demo