我正在研究C ++ 11的新功能,其中一个让我感到困惑,因为我无法找到在Real World中使用它的方法。
它是已删除和默认的函数,是否有人拥有它的实际使用示例,或者它只是添加一些糖的其中一个功能?
答案 0 :(得分:9)
用户声明的特殊成员函数并不简单。如果一个类具有任何重要的特殊成员函数,则该类不是POD。因此,这种类型是POD:
struct S {
S() = default;
S(int) { }
};
但这种类型不是POD:
struct S {
S() { }
S(int) { }
};
答案 1 :(得分:8)
struct A
{
A(const A& arg) : data(arg.data)
{
do_something_special();
}
// by writing copy constructor, we suppress the generation of
// implicit default constructor A::A()
int data;
};
void foo1()
{
A a; // does not work, since there's no default constructor
}
假设我们的默认构造函数没有做任何特殊的操作,并且(或多或少)等于编译器生成的一个。我们可以通过编写我们自己的默认构造函数来修复它(如果我们的类有很多非静态成员,这会很繁琐),或者使用= default
语法:
struct A
{
A() = default;
A(const A& arg) : data(arg.data)
{
do_something_special();
}
int data;
};
当我们想要禁止使用特定的重载或模板特化,或仅仅禁止复制(或移动)对象时,删除函数非常有用。
void foo(char c) {}
void foo(int i) = delete; // do not allow implicit int -> char conversion
当你想禁止复制(即线程对象)时,通常惯用的方法是声明私有拷贝构造函数而不实现(是的,或者使用boost :: noncopyable)。虽然这适用于大多数情况,但有时您可能会遇到一些模糊的链接器错误。考虑:
struct A
{
A() = default;
friend void foo();
private:
A(const A&);
};
void foo()
{
A a;
A b(a); // results in linker error in gcc
}
删除A(const A&)
,我们避免了潜在的链接器错误,并使我们的意图(禁止复制)非常清楚。
答案 2 :(得分:1)
您可以将删除的函数用于要防止复制或直接实例化的类(例如,您想要执行get_instance()函数的单例)。你冷也使用删除来防止你的构造函数的某些变化。
如果您希望编译器生成的构造函数用于隐式生成的任何构造函数,则默认值很有用。例如,如果您创建自定义参数构造函数,编译器将不会生成默认的无参数,因此您可以要求使用default关键字为您生成它。
请参阅此处了解上述
的示例