参考http://en.cppreference.com/w/cpp/language/as_operator处的页面,复制赋值运算符,在编译器需要和可能时自动生成,返回自身类型的左值引用。
因此,当我在下面定义一个重载运算符时,
void operator=(T& t)
编译器是否仍有可能隐式定义默认的复制赋值运算符?
答案 0 :(得分:2)
这是C ++ 11 [class.copy] / 17中的语言标准所指定的复制赋值运算符:
用户声明的复制赋值运算符
X::operator=
是类X
的非静态非模板成员函数,其中只有一个类型X
,X&
的参数,const X&
,volatile X&
或const volatile X&
。
返回类型不会影响它是否被视为复制赋值运算符。它只影响你可以用赋值表达式的结果做什么。
答案 1 :(得分:1)
C++ Reference(正如你自己发现的那样)声明:
如果没有为类类型(struct,class或union)提供用户定义的复制赋值运算符,则编译器将始终将one声明为该类的内联公共成员。
和
类T的复制赋值运算符是非模板非静态成员函数,其名称为operator =,它只取一个类型为T,T&,const T&,volatile T&或const volatile T& T的参数。
换句话说:只要声明自己的复制赋值运算符(采用T&参数),编译器就不会添加隐式运算符。
仍有问题为什么要返回void但是...(C ++编码指南建议返回对self的引用)