C++ 11私有默认构造函数

tho*_*mas 20 c++ gcc default-constructor c++11 gcc4.8

以下C++ 11代码在我的GCC 4.8上成功编译:

struct NonStack
{
private:
  NonStack() = default;
public:
  static NonStack* Create(){
    return new NonStack;
  }
};
NonStack a;

int main() { }
Run Code Online (Sandbox Code Playgroud)

但是,以下给出了编译错误:

struct NonStack
{
private:
  NonStack(){}
};

NonStack a; 

int main() { }
Run Code Online (Sandbox Code Playgroud)

为什么第一个成功?私有默认构造函数不应该通过禁止创建对象NonStack a;吗?

Pra*_*ian 17

这是gcc bug 54812,编译器无法尊重明确默认的特殊成员函数的访问说明符.错误56429,被标记为前一个的副本,其测试用例几乎与问题中的示例相同.

解决方案是升级到gcc4.9,它解决了这个问题.或者为构造函数创建一个空体,而不是像第二个例子中那样显式地默认它.

  • 注意:该bug链接到[核心语言问题1507](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1507).这不是GCC中的错误.该标准确实用过来说,因为构造函数是微不足道的,所以没有调用构造函数,如果没有调用构造函数,那么它是`private`的事实不是问题. (3认同)