C++11:我们什么时候需要为默认成员函数专门化 "=default"?

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

做了一个简单的测试,发现“=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”?

最佳答案

if I don't give definition of special member functions in "Derived", compiler will generate one for me, equal to using "=default".

不,实际上。

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

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

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

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

关于C++11:我们什么时候需要为默认成员函数专门化 "=default"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43382342/

相关文章:

c++ - 检查 const char* 作为非类型模板参数

bash - 如何在 bash 函数参数中保留尾随空格?

ios - 返回两种不同类型的 Swift 函数

c++ - 如何读取 Point vector 的 vector - C++

c++ - 简单的opencv相机程序中抛出异常

c++ - 在 C++ 中解释转义的 unicode 字符

javascript - 使用 fullPage.js 中的 'afterRender' 回调来运行带有 jQ​​uery 事件的代码

c++ - 由于标准容器中元素的默认初始化导致性能下降

c++ - 返回容器

c++ - 将 C++11 转换为等效的 C++98 代码