代码之家  ›  专栏  ›  技术社区  ›  Oliv

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

  •  7
  • Oliv  · 技术社区  · 7 年前

    我在标准中找不到哪里声明禁止显式默认复制构造函数和使用 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 回复  |  直到 7 年前
        1
  •  10
  •   StoryTeller - Unslander Monica    7 年前

    你在正确的部分,但忽略了一些关键的子弹。

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

    形式的函数定义:

    ...

    被称为 明确默认 明确违约的应

    • 具有相同的声明函数类型 (除了可能不同的ref限定符和副本 构造函数或复制赋值运算符, ) 就好像它是含蓄地声明的一样

    [class.copy.ctor]/7

    类型

    X::X(const X&)
    

    如果类类型M(或数组)的每个潜在构造子对象 其中)有一个复制构造函数,其第一个参数的类型为const 119 否则,隐式声明的副本 构造函数将具有表单

    X::X(X&)
    

    ...
    119)这意味着隐式声明的复制构造函数的引用参数不能绑定到易失性左值;

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

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