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)。我已相应地更新了我的问题。