为什么用volatile参数显式默认复制构造函数是不可能的?

时间:2017-10-04 07:29:20

标签: c++ language-lawyer copy-constructor volatile

我无法找到标准中的哪个地方声明禁止使用volatile&const volatile&参数显式默认复制构造函数和复制赋值,如下所示:

struct A{
   A(const volatile A&) =default; // fails to compile on (all) compilers
   };

在[dcl.fct.def.default]中没有这样的限制,而[class.copy]指定A(const volatile A&)是复制构造函数。

注意:我只是在标准文本中查找指定此行为的位置。

1 个答案:

答案 0 :(得分:8)

你在正确的部分,但是忽略了一些重要的子弹。

[dcl.fct.def.default]/1

  

表单的函数定义:

     

...

     

称为显式默认定义。一个功能   明确默认

     
      
  • 具有相同的声明函数类型(可能不同的ref限定符除外,在副本的情况下除外)   构造函数或复制赋值运算符,参数类型可能是   “引用非const T”,其中T是成员的名称   函数的类好像已经隐式声明了,并且
  •   

[class.copy.ctor]/7

  

类X的隐式声明的复制构造函数将具有   形式

X::X(const X&)
     

如果每个可能构造的类型为M(或数组)的子对象   它具有一个复制构造函数,其第一个参数是const类型   M&安培;或const volatile M&。 119 否则,隐式声明的副本   构造函数将具有

形式
X::X(X&)
     

...
   119)这意味着隐式声明的复制构造函数的引用参数不能绑定到volatile lvalue;

如果总结上述内容,那么明确违约副本的唯一两个选择就是:

struct A {
   A(const A&) = default;
};

struct B {
   B(B&) = default;
};

当标准说A(const volatile A&)是复制构造函数时。这意味着带有这样一个参数的用户提供的 c可以是类复制c&tor; tor。