【问题标题】:defaulted default constructor ? in n3290 draft默认的默认构造函数?在 n3290 草案中
【发布时间】:2011-11-20 03:11:35
【问题描述】:

n3290 草案 §12.1(构造函数)¶5 中的一点:

隐式声明的默认构造函数是 inline public 的成员 它的类。类X默认默认构造函数 被定义为已删除 如果:

  • X 是一个类似联合的类,它有一个变体成员 默认构造函数,
  • 任何没有大括号或相等初始化器的非静态数据成员都属于 引用类型,
  • const 限定类型(或数组)的任何非变体非静态数据成员 其中)没有大括号或相等初始化器没有用户提供的 默认构造函数,
  • X 是一个联合,它的所有变体成员都是 const 限定类型 (或其数组),
  • X 是一个非联合类,任何匿名联合成员的所有成员都属于 const 限定类型(或其数组),
  • 任何直接或虚拟基类,或非静态数据成员,没有 大括号或相等初始化器,具有类类型M(或其数组),并且 M 没有应用的默认构造函数或重载决议 (13.3) M 的默认构造函数会导致歧义或导致 从默认的默认构造函数中删除或无法访问,或者
  • 任何直接或虚拟基类或非静态数据成员的类型都带有
    从默认的默认构造函数中删除或无法访问的析构函数

请用一些示例程序解释默认的默认构造函数

【问题讨论】:

    标签: c++ constructor c++11 default-constructor


    【解决方案1】:

    我认为 this 摘自维基百科解释了这一点:

    显式默认和删除的特殊成员函数

    在 C++03 中,编译器为自身不提供的类提供默认构造函数、复制构造函数、复制赋值运算符 (operator=) 和析构函数。程序员可以通过定义自定义版本来覆盖这些默认值。 C++ 还定义了几个适用于所有类的全局运算符(例如 operator= 和 operator new),程序员可以覆盖这些运算符。

    但是,对这些默认值的创建几乎没有控制。例如,使一个类本质上不可复制,需要声明一个私有复制构造函数和复制赋值运算符,而不是定义它们。尝试使用这些函数违反了单一定义规则。虽然不需要诊断消息,[5] 这通常会导致链接器错误。[需要引用]

    在默认构造函数的情况下,如果一个类定义了任何构造函数,编译器将不会生成默认构造函数。这在很多情况下都很有用,但同时拥有专门的构造函数和编译器生成的默认值也很有用。

    C++11 将允许显式默认和删除这些特殊成员函数。例如,以下类型显式声明它正在使用默认构造函数:

    代码示例:

    struct SomeType 
    {
        SomeType() = default; //The default constructor is explicitly stated.
        SomeType(OtherType value);
    };
    

    由于您似乎是 Standerdese 的粉丝(几乎您的所有问题都在标准引文上寻求解释),这篇关于标准提交如何定义默认和删除函数的论文应该适合您阅读:

    Defaulted and Deleted Functions

    【讨论】:

      【解决方案2】:

      如果使用= default; 语法声明其中一个特殊成员函数,则它是“默认”的。您引用的第一行之前的行说明:

      如果类 X 没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认 (8.4)。

      因此,“默认”默认构造函数是使用= default 声明的默认构造函数(可以不带参数调用的构造函数)。这可以使用= default 语法显式定义,或根据上述行隐式定义。

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 2014-05-18
        • 1970-01-01
        • 2016-01-06
        • 2012-06-30
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多