代码之家  ›  专栏  ›  技术社区  ›  Gunther Piez

C++默认赋值操作符什么时候变得不可访问?

c++
  •  6
  • Gunther Piez  · 技术社区  · 15 年前

    如果我定义了自己的赋值运算符,它的签名与通常生成的默认赋值运算符不同:

    struct B;
    struct A {
    void operator = (const B& b) {
        // assign something
    }
    };
    

    在这种情况下,默认赋值运算符 operator = (A&) (或者类似的,如果错误的话纠正我)变得不确定/不可接近?

    如果我们定义其他的构造函数,那么对于不存在的默认构造函数来说,这是正确的。 但我真的不确定这是否适用于其他“魔法”默认值。

    我问的原因是:我想避免通过隐式类型转换意外调用默认的复制构造函数。如果它不存在,就永远不会发生。

    3 回复  |  直到 13 年前
        1
  •  12
  •   AProgrammer    15 年前

    第12.8/9号指出,类x的赋值运算符必须是非静态、非模板的,参数类型为x、x&、x const&、x volatile&或x const volatile&。还有一个说明,它强调模板的实例化不会抑制隐式声明。

        2
  •  4
  •   xtofl Adam Rosenfield    15 年前

    自从 A& operator=( B& ) 没有的签名 A& operator=( const A& ) ,这对合成的赋值运算符不起任何作用。

    看一看 this snippet at codepad.org -就一个例子而言,就是证据。

    试驾会也表明 运算符=(const a&) 合成。

        3
  •  1
  •   Bernhard Bodenstorfer    13 年前

    如果我们定义其他的构造函数,那么对于不存在的默认构造函数来说,这是正确的。但我真的不确定这是否适用于其他“魔法”默认值。

    默认值 复制构造函数 不会受到其他建造商的影响

    我问的原因是:我想避免通过隐式类型转换意外调用默认的复制构造函数。如果它不存在,就永远不会发生。

    或赋值运算符。例如:

        class A {
                private:
                A& operator= ( const A& a );    // private here means: forbidden operator
                public:
                A( int i ) {}
        };
    
        int main () {
                A a(2);
                A b(a);         // copy constructor syntax 1
                A c = a;        // copy constructor syntax 2
                // Forbidden: A d;
                // Forbidden: c = a;
        }
    

    要禁用默认的复制构造函数,请将其声明为私有(当然,不需要实现)。关于您的用例,您可能还需要查看关键字“explicit”,以抑制自动类型转换。