如果我定义了一个自己的赋值运算符,它的签名与通常生成的默认赋值运算符不同:
struct B;
struct A {
void operator = (const B& b) {
// assign something
}
};
默认赋值运算符,在这种情况下是operator = (A&)
(或类似的,如果错误则纠正我)变得未定义/不可访问?
AFAIK对于默认构造函数,如果我们定义了一些其他构造函数,则这是不存在的。 但我真的不确定其他“神奇”默认情况是否属于这种情况。
我问的原因:我想避免通过隐式类型转换意外调用默认的复制构造函数。如果它不存在,它永远不会发生。
答案 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”以禁止自动类型转换。