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

Oli*_*liv 5 c++ volatile copy-constructor language-lawyer

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

struct A{
   A(const volatile A&) =default; // fails to compile on (all) compilers
   };
Run Code Online (Sandbox Code Playgroud)

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

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

Sto*_*ica 8

你在正确的部分,但俯视一些关键的子弹.

[dcl.fct.def.default]/1:

表单的函数定义:

...

被称为明确默认的定义.明确默认的函数应该

  • 具有相同的声明函数类型(可能不同的ref限定符除外,在复制构造函数或复制赋值运算符的情况下,参数类型可以是"引用非const T",其中T是成员函数的类)就像它已被隐式声明一样,并且

[class.copy.ctor]/7:

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

X::X(const X&)
Run Code Online (Sandbox Code Playgroud)

如果类型M(或其数组)的每个可能构造的子对象具有复制构造函数,其第一个参数是const M&或const volatile M&.119否则,隐式声明的复制构造函数将具有该表单

X::X(X&)
Run Code Online (Sandbox Code Playgroud)

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

如果总结上述内容,那么明确默认复制文件的唯一两个选项是:

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

struct B {
   B(B&) = default;
};
Run Code Online (Sandbox Code Playgroud)

当标准说A(const volatile A&)是复制构造函数时.这意味着具有这种参数的用户提供的 c'tor可以是复制c'tor类.