std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?

Mon*_*nad 34 c++ stl rvalue-reference c++-concepts c++20

根据en.cppreference.com(据我所知):

  • std::is_convertible被性状类需要类型FromTo为使得与返回类型的函数To返回一个From值可以通过编译。
  • std::convertible_to是一个概念,要求类型From&To如上所述,AND使得类型的r 值引用From可以转换为static_cast<To>

强加的要求std::is_convertible似乎相对简单。相反,对于 C++20 特性的简单示例中显示的这种通用概念,r 值引用转换要求std::convertible_to似乎奇怪地特定。

作为 C++ 的新手,我无法完全理解两个网页中提供的一些术语和部分补充说明,我无法想象两者的要求之间的确切区别。

一些相互关联的问题:

  • 类型From& Toof 不仅受到std::is_convertible奇怪的 r 值引用转换要求的约束,而且受到奇怪的 r 值引用转换要求的实际影响是什么?
  • 什么样的候选人类型的FromTo附加由R值参考铸件的要求被拒绝?
  • 为什么程序员可能想要使用std::is_convertiblestd::convertible_to中的一个而不是另一个作为其函数返回类型或参数类型的约束(除了概念的便利性)?

一个更简单的解释或一个例子会有所帮助。谢谢!

Bar*_*rry 32

std::is_convertible<From, To>(类型特征)检查 typeFrom是否可以隐式转换为 type To

std::convertible_to<From, To>(概念)检查From隐式和显式转换为To. 这种情况很少见,这种类型很荒谬,但是在通用代码中不必担心这种情况很好。

一个例子:

struct From;
struct To {
    explicit To(From) = delete;
};
struct From {
    operator To();
};

static_assert(std::is_convertible_v<From, To>);
static_assert(not std::convertible_to<From, To>);
Run Code Online (Sandbox Code Playgroud)

  • -0.1 用于使用“not”而不是“!” (3认同)
  • +100 表示“在通用代码中不必担心这种情况很好。” - 标准库概念的大部分要点是为了明确我们通过正式排除此类情况来考虑这种病态情况。 (2认同)