如果我有编译器删除的明确默认的函数声明,是否有诊断标志或工具可以警告我?
如果没有,那为什么呢?可以将默认成员删除作为期望的行为吗?这种情况何时发生?多久一次?
详细信息
我正在使用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
函数)的警告会有所帮助。
答案 0 :(得分:3)
您需要做的是将默认成员的定义移出类:
std::ostream& operator<<(std::ostream& output, const Test<T1, T2>& t0);
一旦您将其定义为异常,那么您将得到一个编译器错误,因为如果要删除该成员函数,则无法通过friend
进行定义:
错误:默认此移动分配运算符会在之后将其删除 它的第一个 声明NotMoveA&NotMoveA :: operator =(NotMoveA && other)=默认值;