c++ - =默认忽略访问说明符?

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

我觉得很奇怪,尽管默认构造函数是 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

Live demo

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

相关文章:

c++ - unique_lock 与使用互斥锁相比有什么特殊用途?

c++ - 我如何在 C++03 中伪造构造函数继承?

c++ - 使用结构模板的结构模板

c++ - 有没有关于如何使用英特尔 MKL FFT 的简单 C++ 示例?

c++ - 为什么在使用堆叠 std::array 声明多维数组时需要 "double braces"?

C++11 Lambda 和模板导致奇怪的链接器行为

c++ - 如何从编号的txt文件中读取? (data1.txt、data2.txt 等)

C++ 标准委员会 "reflector"邮件列表

c++ - 我可以 std::bind 基类的构造函数,以便派生类不需要显式调用它吗?

c++ - 在构造函数中调整字符串成员的大小