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

时间:2009-08-19 12:44:16

标签: c++

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

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

默认赋值运算符,在这种情况下是operator = (A&)(或类似的,如果错误则纠正我)变得未定义/不可访问?

AFAIK对于默认构造函数,如果我们定义了一些其他构造函数,则这是不存在的。 但我真的不确定其他“神奇”默认情况是否属于这种情况。

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

3 个答案:

答案 0 :(得分:12)

没有。 12.8 / 9表示X类的赋值运算符必须是非静态的非模板,其参数类型为X,X& X const& X volatile&或X const volatile&amp ;.并且有一个注释强调模板的实例化不会抑制隐式声明。

答案 1 :(得分:4)

由于A& operator=( B& )没有A& operator=( const A& )的签名,因此对合成的分配运算符没有任何作用。

看一下this snippet at codepad.org - 只要一个例子算作证明。

用它测试驾驶Comeau还表明A& operator=( const A& )是合成的。

答案 2 :(得分:1)

  

AFAIK对于默认构造函数,如果我们定义了一些其他构造函数,则这是不存在的。但我真的不确定其他“神奇”默认情况是否属于这种情况。

默认的复制构造函数不受另一个构造函数的影响......

  

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

...或赋值运算符。例如:

    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;
    }

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