删除明确默认的函数声明时发出警告

时间:2018-08-22 15:21:26

标签: c++ c++11 warnings compiler-warnings static-analysis

如果我有编译器删除的明确默认的函数声明,是否有诊断标志或工具可以警告我?

如果没有,那为什么呢?可以将默认成员删除作为期望的行为吗?这种情况何时发生?多久一次?


详细信息

我正在使用clang版本5.0.1,但是通过最新的MSVC或gcc版本发出警告也可以。

我所拥有的简化示例:

class NotMoveA
{
public:
  explicit NotMoveA(Foo f);
  ~NotMoveA() = default;
  NotMoveA(const NotMoveA &) = delete;
  NotMoveA(NotMoveA &&other) = default;
  NotMoveA &operator=(const NotMoveA &) = delete;
  //will B deleted w/o warning:
  NotMoveA &operator=(NotMoveA &&other) = default; 
  // ...
private:
  const std::string badDataMemberDisallowingMoveAssignment;
  // ...
}

,并在NotMoveA中使用了std::vector。由于NotMoveA不是MoveAssignable,所以我遇到了一些错误,这些错误的原因使我花了相当长的时间才能弄清楚。直接针对原因(即删除的= default函数)的警告会有所帮助。

1 个答案:

答案 0 :(得分:3)

您需要做的是将默认成员的定义移出类:

std::ostream& operator<<(std::ostream& output, const Test<T1, T2>& t0);

一旦您将其定义为异常,那么您将得到一个编译器错误,因为如果要删除该成员函数,则无法通过friend进行定义:

  

错误:默认此移动分配运算符会在之后将其删除   它的第一个         声明NotMoveA&NotMoveA :: operator =(NotMoveA && other)=默认值;