2009-08-19 26 views
6

如果我定义自己的赋值操作符,它有不同的签名比正常生成默认赋值运算符:什么时候C++默认赋值运算符变得无法访问?

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

确实默认赋值运算符,在这种情况下operator = (A&)(或类似的,如果错了指正)变得未定义/无法访问?

AFAIK这是默认的构造函数,它不存在,如果我们定义一些其他的构造如此。 但我真的不确定这是否是其他“魔术”默认值的情况。

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

回答

12

号12.8/9说,对于类X赋值运算符必须是非静态的,非模板与式X,X &的参数,X常量&,X挥发性&或X常量挥发性&。还有一个说明强调模板的实例不能抑制隐式声明。

+0

感谢您的标准参考!这实际上比我的例子说的更多。 – xtofl 2009-08-19 13:08:47

+0

你说得对。我会删除我的答案。 – 2009-08-19 13:09:29

+0

@Neil,你想知道use = default可能是什么。一个是要明确可用的内容,另一个是要改变可访问性,第三个是允许实现不内联,同时确保类的进化不会打破它。另一个理由是,这个特征的范围比分配范围更广,即使它没有用,也没有动机去做例外。 – AProgrammer 2009-08-19 13:17:44

4

由于A& operator=(B&)还没有的A& operator=(const A&)签名,这无助于合成assignement操作。

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

试驾科莫它也表明,A& operator=(const A&)合成。

+0

非常有趣的例子。我将使默认的复制分配操作员保密。 – hirschhornsalz 2009-08-19 13:09:12

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”来抑制自动类型转换。