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

C++ =默认忽略访问说明符?,c++,c++11,constructor,defaulted-functions,C++,C++11,Constructor,Defaulted Functions,我发现很奇怪,尽管默认构造函数是private(4.8.1g++),下面的程序仍然编译得很好: 实际上来自标准(N3242)的8.4.2[2] 只有当显式默认函数被隐式声明为constexpr时,才可以将其声明为constexpr。如果在其第一次声明中显式默认 -它应该是公开的 默认说明符忽略访问规范的确切目的是什么?我觉得这可能会导致一个接口问题,而类设计器不希望用户创建默认值,但在实现中需要默认构造函数。我认为这可能是因为默认构造函数通常是public,因此default旨在复制它-但这并

我发现很奇怪,尽管默认构造函数是
private
(4.8.1g++),下面的程序仍然编译得很好:

实际上来自标准(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

 }
实际上,我无法从标准中看出,它提到显式默认的
复制/移动
构造函数/分配没有公开
这是一个gcc错误。包含一个与您的示例几乎相同的示例。包含指向几个相关错误报告的链接,其中的错误报告已在GCC4.9中修复,GCC4.9确实拒绝您的代码

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

好的,谢谢。我想我误解了《标准》中的那句话。它完全特定于
constepr
声明函数的上下文。@Silversonic您引用的是哪个版本的标准?我在N3337或N4296I中都找不到it应为公共部分。我正在查看N3242。我认为如果我使用C++11,这是最好的一个?我应该换成N3337吗?@Silversonic N3337是在ISO C++11标准版(不是免费版)之后发布的第一稿。Richard Smith说,它只包含与已发布标准的微小编辑差异,因此我将切换到该版本,而不是使用发布前的版本。@Silversonic,这一问题导致了您引用内容措辞的变化
error: 'constexpr A::A()' is private