为什么具有复制构造函数和删除的移动构造函数的类不能转换为自身?

问题描述 投票:0回答:1

查询“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
To
都可能是 cv 限定的
void
) ),提供等于的成员常量值
true

我的理解是,具有复制构造函数的类只能转换为自身......我错过了什么?谢谢。

编辑:

我进一步调查并根据上面的引用定义了以下内容:

OnlyCopyable test() { return std::declval<OnlyCopyable>(); }

低了你看,这不适用于错误消息

error: use of deleted function 'OnlyCopyable::OnlyCopyable(OnlyCopyable&&)'

我可以明白为什么上面的方法失败了,因为删除的运算符仍然参与重载决策,并且如果选择会导致失败。

这仍然让我困惑......为什么可兑换性以这种方式定义?当然,该类仍然可以转换...只是通过复制而不是移动?

c++ delete-operator
1个回答
0
投票

这仍然让我困惑......为什么可兑换性以这种方式定义?当然,该类仍然可以转换...只是通过复制而不是移动?

我认为类可复制但不可移动是荒谬的1,所以这不是标准应该关心的情况。 “

To test() { return std::declval<From>(); }
格式良好”测试是简单,而这种简单性是有价值的。

  1. 您始终可以从副本合成移动,因为参数成为主体中的左值:
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...
};
© www.soinside.com 2019 - 2024. All rights reserved.