【问题标题】:C++11: When do we need to specialize "=default" for default member function?C++11:我们什么时候需要为默认成员函数专门化“=default”?
【发布时间】:2017-04-13 01:59:12
【问题描述】:

做了一个简单的测试,发现“=default”只对特殊的成员函数有效,像这样:

#include<cstdio>
#include<utility>
struct Base{
    Base(int){printf("Base(int)\n");}
};
struct Derived{
    Derived(int)=default;
};
int main(){
    Derived d(0);
    return 0;
}

clang会报编译错误:

error: only special member functions may be defaulted

所以如果只允许“特殊成员函数”,这个“=default”似乎没有用:因为如果我在“Derived”中没有给出特殊成员函数的定义,编译器会为我生成一个,等于使用“=default”。

所以我的问题是,为什么以及何时需要“=default”?

【问题讨论】:

    标签: c++ function c++11 default member


    【解决方案1】:

    如果我在“Derived”中没有给出特殊成员函数的定义,编译器会为我生成一个,相当于使用“=default”。

    实际上没有。

    声明任何构造函数 - 你的编译器提供的默认构造函数将消失。要恢复它(以编译器提供的形式),您可以将其定义为 = default

    提供一个用户声明的析构函数 - 你的编译器提供的移动构造函数和移动赋值运算符将消失。要将它们带回来,您可以将它们定义为 = default

    提供一个用户声明的移动赋值运算符 - 你的编译器提供的复制构造函数和复制赋值运算符将消失。好吧,你明白了。

    = default 用于在某些情况下需要恢复编译器提供的特殊成员函数的功能,而其他情况导致该函数“消失”。

    【讨论】:

      【解决方案2】:

      因为如果我在“Derived”中没有给出特殊成员函数的定义,编译器会为我生成一个,相当于使用“=default”。

      因为在某些情况下某些特殊的成员函数不会生成,例如当您声明复制构造函数时,不会生成移动构造函数,然后移动请求将由复制构造函数处理。添加(默认)移动构造函数可以防止:

      struct Derived {
          Derived(const Derived&) { ... }
          Derived(Derived&&) = default;
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 2020-11-08
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 2022-11-13
        • 2020-10-19
        相关资源
        最近更新 更多