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++ 编译器生成的复制构造函数/赋值是否呈现';具有常量/易失性的s参数_C++_Constants_Compiler Generated - Fatal编程技术网

C++ 编译器生成的复制构造函数/赋值是否呈现';具有常量/易失性的s参数

C++ 编译器生成的复制构造函数/赋值是否呈现';具有常量/易失性的s参数,c++,constants,compiler-generated,C++,Constants,Compiler Generated,有一些函数,编译器可以在需要时隐式地为我们定义,如果可以为该类正确地定义它们的话。像 默认构造函数 复制构造函数 赋值运算符 析构函数 所以,编译器生成的复制构造函数/赋值是将其参数作为常量引用还是非常量引用 class Test { public: Test(const Test&); << _1 Test(Test&); << _2 }; 类测试 { 公众: 测试(常数测试&)注释中提供的Pr

有一些函数,编译器可以在需要时隐式地为我们定义,如果可以为该类正确地定义它们的话。像

  • 默认构造函数
  • 复制构造函数
  • 赋值运算符
  • 析构函数
所以,编译器生成的复制构造函数/赋值是将其参数作为
常量引用
还是
非常量引用

class Test
{
  public:
    Test(const Test&);      << _1
    Test(Test&);            << _2 
};
类测试
{
公众:
测试(常数测试&)注释中提供的Pradhan中的规则可以直观地理解如下:编译器将尝试使用参数
const T&
定义副本构造函数(如果可能);如果没有,则将尝试使用参数
T&
定义副本构造函数;如果也不可能,则复制构造函数将被定义为已删除

当类类型为
T
的对象被复制时,它的基类和非静态数据成员也必须被复制。因此,如果其中一个,比如说,
U
有一个复制构造函数,它采用
U&
而不是
const U&
,那么如果
T
的构造函数采用
const T&
,那么所有子对象都将l然后也是cv限定的,并且您无法获得
U&
。因此,编译器必须放弃使用
const t&
的复制构造函数,转而使用
t&
。同样,如果某个基类或非静态数据成员不能被复制,那么编译器使用为
T
生成已删除的副本构造函数


对于复制赋值运算符,规则基本相同,只是编译器查找基类和非静态数据成员的复制赋值运算符(而不是它们的复制构造函数),并且允许复制赋值运算符按值获取参数(与复制构造函数不同).

隐式定义的复制构造函数的规则可能会有所帮助。根据链接,它是
const Test&
Test&
,具体取决于类父类的复制构造函数。