Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除显式默认函数声明时发出警告_C++_C++11_Warnings_Compiler Warnings_Static Analysis - Fatal编程技术网

C++ 删除显式默认函数声明时发出警告

C++ 删除显式默认函数声明时发出警告,c++,c++11,warnings,compiler-warnings,static-analysis,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 &) =

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

若否,原因为何?被删除的默认成员是否为期望的行为?这种情况何时发生,多久发生一次


详细信息

我使用的是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;
  // ...
}

并在
std::vector
中使用
NotMoveA
。由于
NotMoveA
是不可移动的,所以我得到了一些错误,这些错误的原因花了我很长时间才弄清楚。如果直接在原因处(即在deleted
=default
函数处)发出警告,可能会有所帮助。

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

class NotMoveA
{
public:
  NotMoveA() = default;
  ~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); 
  // ...
private:
  const std::string badDataMemberDisallowingMoveAssignment;
  // ...
};

NotMoveA & NotMoveA::operator=(NotMoveA &&other) = default;
一旦将其定义为越界定义,则会出现编译器错误,因为如果要删除成员函数,则无法通过
=default
定义该函数:

错误:默认此移动分配运算符将在 第一次 声明NotMoveA&NotMoveA::operator=(NotMoveA&other)=默认值


您使用的编译器是什么?声明主构造函数
default
是需要更正的语法错误。只能声明Default、Copy和Move构造函数
Default
,非默认构造函数不能声明。我怀疑编译器是否会对此发出警告。被删除的默认成员通常是期望的行为。感谢YSC、Xirema和@user2079303(+3)。我已相应地更新了我的问题。