查询“is_convertible_v移动构造函数已删除”和“c++删除的移动构造函数使类无法转换为自身”,所以我希望我没有重复已经回答过的内容...这里...
我有以下课程:
#include <type_traits>
struct OnlyCopyable {
OnlyCopyable() { }
~OnlyCopyable() { }
OnlyCopyable(const OnlyCopyable &src) { }
OnlyCopyable& operator=(const OnlyCopyable &other) { return *this; }
OnlyCopyable(OnlyCopyable &&other) = delete;
OnlyCopyable& operator=(OnlyCopyable &&other) = delete;
};
static_assert(std::is_convertible_v<OnlyCopyable, OnlyCopyable>);
它似乎无法转换为自身。这是为什么?
如果我注释掉显式删除移动运算符的行,它将变得可转换。这是为什么?
CPPReference 有这样说:
如果虚函数定义
格式良好(即,To test() { return std::declval<From>(); }
可以使用隐式转换转换为std::declval<From>()
,或者To
和From
都可能是 cv 限定的To
) ),提供等于的成员常量值void
true
我的理解是,具有复制构造函数的类只能转换为自身......我错过了什么?谢谢。
编辑:
我进一步调查并根据上面的引用定义了以下内容:
OnlyCopyable test() { return std::declval<OnlyCopyable>(); }
低了你看,这不适用于错误消息
error: use of deleted function 'OnlyCopyable::OnlyCopyable(OnlyCopyable&&)'
。
我可以明白为什么上面的方法失败了,因为删除的运算符仍然参与重载决策,并且如果选择会导致失败。
这仍然让我困惑......为什么可兑换性以这种方式定义?当然,该类仍然可以转换...只是通过复制而不是移动?
这仍然让我困惑......为什么可兑换性以这种方式定义?当然,该类仍然可以转换...只是通过复制而不是移动?
我认为类可复制但不可移动是荒谬的1,所以这不是标准应该关心的情况。 “
To test() { return std::declval<From>(); }
格式良好”测试是简单,而这种简单性是有价值的。
struct ExplicitMove {
ExplicitMove(const ExplicitMove &src);
ExplicitMove& operator=(const ExplicitMove &other);
ExplicitMove(ExplicitMove &&other) : ExplicitMove(other) {}
ExplicitMove& operator=(ExplicitMove &&other) { return *this = other; }
// Other members...
};