参考http://en.cppreference.com/w/cpp/language/as_operator的页面,复制赋值运算符(在编译器需要时并且可能的时候自动生成)将返回自身类型的左值引用。对于重载操作符=返回无效是否是复制操作符?
所以,当我定义一个重载的操作如下,
void operator=(T& t)
是否还有机会编译器将隐式地定义一个默认的拷贝赋值运算符?
参考http://en.cppreference.com/w/cpp/language/as_operator的页面,复制赋值运算符(在编译器需要时并且可能的时候自动生成)将返回自身类型的左值引用。对于重载操作符=返回无效是否是复制操作符?
所以,当我定义一个重载的操作如下,
void operator=(T& t)
是否还有机会编译器将隐式地定义一个默认的拷贝赋值运算符?
这是一个拷贝赋值运算符,如语言标准所规定的,在C++ 11 [class.copy]/17:
甲用户声明的复制赋值运算符
X::operator=
是X
类的非静态的非模板成员函数X
类型,X&
,const X&
,volatile X&
的正好一个参数或const volatile X&
。
返回类型不影响它是否被认为是复制赋值操作符。它只影响你可以用赋值表达式的结果做什么。
所以,没有(标题)和是(正文)。 –
C++ Reference(当你发现自己)声明:
如果提供了一个类类型(结构,类或联合)没有用户定义的复制赋值运算符,编译器将始终声明一个作为该班级的内联公共成员。
和
类T的拷贝赋值运算符是与该名操作者的非模板非静态成员函数=在于采用类型T,T &,常量Ť&的正好一个参数,挥发性牛逼&或const volatile牛逼&
所以,换句话说:只要你声明自己的拷贝赋值运算符(这需要一件T &参数),编译器不会添加隐式的。
总还是有问题,为什么返回void但是...(C++编码规范建议返回引用自己)
返回类型不被认为是函数签名的一部分,所以我期望不是 – EdChum
为什么你会使返回无效?如果你这样做,你不能做像'foo a = b = c = d = some_val;' – NathanOliver
@NathanOliver:那会是件坏事? –