【问题标题】:Why declare a deleted assignment operators with the ref-qualifier &为什么要使用 ref 限定符 & 声明已删除的赋值运算符
【发布时间】: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.
  • 这和巴里的回答一样有趣。

标签: c++ c++14


【解决方案1】:

在这种情况下,没有理由添加 & 限定符。

关键是要防止您的课程被复制分配,期间。 & 限定符的目的是防止您的类的 rvalue 可复制分配(在这种情况下,& 将阻止复制分配运算符成为可行的函数)。但这不是您的目标 - 您希望 all 复制分配格式不正确,所以这只是:

MyType& operator=(MyType const&) = delete;

然后向写静态检查的人投诉。


问题:

MyType& operator=(MyType const&) & = delete;

您要删除的运算符的额外精度是否表明不存在的意图。我立即被引导想知道,在课堂上的某个地方,出于某种原因,你有:

MyType& operator=(MyType const&) && { ... }

而你没有,因为那很愚蠢。

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 2019-04-12
    • 1970-01-01
    • 2021-12-16
    • 2020-11-22
    • 2015-05-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多