【发布时间】:2019-02-25 21:46:50
【问题描述】:
据我所知,用户声明的赋值运算符不同于内置运算符,正如this stackoverflow answer 所解释的那样。但是为什么要在已删除的运算符中添加“&”呢?
// C++
class MyType
{
public:
// ...
MyType& operator=(MyType const&) & = delete;
MyType& operator=(MyType &&) & noexcept = default;
// more
};
我问是因为我的静态代码检查器在这里报告了违反规则的情况,我认为没有理由为已删除的运算符添加“&”。我错过了什么吗?
【问题讨论】:
-
哪个静态检查器以及假定的违规行为是什么?
-
@luk32 我们在遵循 Autosar C++14 规则时使用 Polyspace 得到它
-
@luk32 我猜你会得到所有支持 A12-8-7(AUTOSAR C++14,例如 17-10)的静态分析工具报告的发现(对于默认操作符)或HIC++ v4.0 12.5.7。该规则的基本原理是用户声明的赋值运算符与内置运算符不同:它们接受右值作为参数。添加“&”会禁止右值参数,并确保只能对左值对象而不是临时对象进行调用。那是为了避免例如
func() = other_obj. -
这和巴里的回答一样有趣。