Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有办法禁用类上的构造函数合成?_C++_Gcc - Fatal编程技术网

C++ 有没有办法禁用类上的构造函数合成?

C++ 有没有办法禁用类上的构造函数合成?,c++,gcc,C++,Gcc,假设我有一个类,我想确保我的编译器(在本例中是GCC)不会为其合成任何构造函数或赋值方法。我发现了一种方法,就是只在类中包含一个const int成员,但这并不能很好地影响我。是否有一个属性或某些东西表示这一点。如果您自己定义(或仅声明)它,那么编译器将不会为您定义它 struct A { A (); /*declaration is enough to prevent the compiler from generating default constru

假设我有一个类,我想确保我的编译器(在本例中是GCC)不会为其合成任何构造函数或赋值方法。我发现了一种方法,就是只在类中包含一个const int成员,但这并不能很好地影响我。是否有一个属性或某些东西表示这一点。

如果您自己定义(或仅声明)它,那么编译器将不会为您定义它

struct A
{
     A (); /*declaration is enough to prevent the compiler from 
             generating default constructor!*/
};
虽然声明足以阻止编译器生成默认构造函数,但如果代码需要默认构造函数,则必须定义它,否则会出现链接器错误

在C++11(新的ISO标准)中,可以禁用构造函数、复制构造函数和复制赋值,如下所示:

struct A
{
    A(const A&) = delete;            //disable copy-constructor
    A& operator=(const A&) = delete; //disable copy-assignment
};

现在是有趣的部分 您还可以有选择地禁用所选类型的构造函数,这使得
delete
更有趣。考虑这个,

struct A
{
       A (int) {}
};
此类的对象不仅可以使用
int
参数创建,还可以使用隐式转换为
int
的任何类型创建。比如说,

A a1(10);  //ok
A a2('x'); //ok - char can convert to int implicitly

B b; 
A a3(b); //ok - assume b provides user-defined conversion to int
现在假设,无论出于何种原因,我不希望类
A
的用户创建具有
char
B
的对象,这些对象幸运或不幸地可以隐式转换为
int
,那么您可以禁用它们,如下所示:

struct A
{
     A(int) {}
     A(char) = delete;      //disable
     A(const B&) = delete;  //disable
};
现在给你:

A a1(10);  //ok
A a2('x'); //error

B b; 
A a3(b); //error - assume (even if) b provides user-defined conversion to int
在线演示:

错误信息非常清楚:

程序cpp:9:5:错误:已删除函数“A::A(char)”
程序cpp:10:5:错误:删除了函数“A::A(常量B&)”


经典的方法是声明它们,但从不实现它们。大多数人都希望该声明是保密的或受保护的


在C++0x中,可以显式删除它们。它的作用基本相同,但阅读起来更方便。

请注意,boost有一个
boost::noncopyable
类,可以用作想要删除复制构造函数(和
操作符=
)的类中的私有基,该类不希望垃圾评论,但这个答案太棒了@伊塞诺布:谢谢。您还可以看到: