我无法找到标准中的哪个地方声明禁止使用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&)
是复制构造函数。
注意:我只是在标准文本中查找指定此行为的位置。
答案 0 :(得分:8)
你在正确的部分,但是忽略了一些重要的子弹。
表单的函数定义:
...
称为显式默认定义。一个功能 明确默认
- 具有相同的声明函数类型(可能不同的ref限定符除外,在副本的情况下除外) 构造函数或复制赋值运算符,参数类型可能是 “引用非const T”,其中T是成员的名称 函数的类)好像已经隐式声明了,并且
类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。