2015-04-20 35 views
1

参考http://en.cppreference.com/w/cpp/language/as_operator的页面,复制赋值运算符(在编译器需要时并且可能的时候自动生成)将返回自身类型的左值引用。对于重载操作符=返回无效是否是复制操作符?

所以,当我定义一个重载的操作如下,

void operator=(T& t) 

是否还有机会编译器将隐式地定义一个默认的拷贝赋值运算符?

+3

返回类型不被认为是函数签名的一部分,所以我期望不是 – EdChum

+5

为什么你会使返回无效?如果你这样做,你不能做像'foo a = b = c = d = some_val;' – NathanOliver

+7

@NathanOliver:那会是件坏事? –

回答

2

这是一个拷贝赋值运算符,如语言标准所规定的,在C++ 11 [class.copy]/17:

甲用户声明的复制赋值运算符X::operator=X类的非静态的非模板成员函数X类型,X&const X&volatile X&的正好一个参数或const volatile X&

返回类型不影响它是否被认为是复制赋值操作符。它只影响你可以用赋值表达式的结果做什么。

+0

所以,没有(标题)和是(正文)。 –

1

C++ Reference(当你发现自己)声明:

如果提供了一个类类型(结构,类或联合)没有用户定义的复制赋值运算符,编译器将始终声明一个作为该班级的内联公共成员。

类T的拷贝赋值运算符是与该名操作者的非模板非静态成员函数=在于采用类型T,T &,常量Ť&的正好一个参数,挥发性牛逼&或const volatile牛逼&

所以,换句话说:只要你声明自己的拷贝赋值运算符(这需要一件T &参数),编译器不会添加隐式的。

总还是有问题,为什么返回void但是...(C++编码规范建议返回引用自己)

+0

因此,它取决于用户定义的'void operator =(T&t)'是否符合复制赋值运算符或非复制赋值运算符的条件,但是您不回答它们中的哪一个。 (你的链接也会回答这个问题,所以你可以在你的答案中多加一点。) – hvd

+0

@ hvd相应地更新了答案......谢谢指出。 – Daniel

+0

我不明白你如何从这两个引语中得出结论(尽管我并不是说结论是错误的)。第一个特别没有说什么会导致编译器*不生成隐式赋值运算符。它只提供了一个条件,可以保证*会生成一个。并没有说明是否还有其他可能满足的条件。 –