我发现很奇怪,尽管默认构造函数为private(4.8.1 g++),但以下程序仍然可以正常编译:

 class A{
 private:
     A() = default;
     A(const A&) = default;
 };

 int main(){

     A a;

 }
实际上来自标准(N3242)的8.4.2 [2]

默认说明符忽略访问说明的确切目的是什么?我觉得这可能会导致类设计器不必要的接口(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

Live demo

关于c++ - = default忽略访问说明符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33180114/

10-11 18:36