std::is_convertible 和 std::convertible_to 之间的区别(实际上)?
Differences between std::is_convertible and std::convertible_to (in practice)?
根据en.cppreference.com(据我所知):
std::is_convertible
是一个特征 class 要求类型 From
& To
是 return 类型 To
的函数return一个From
值可以编译。
std::convertible_to
是一个概念,要求类型 From
和 To
如上所述,AND 这样 [=47= From
类型的 ]r 值引用 可以用 static_cast<To>
. 转换
std::is_convertible
提出的要求似乎比较直截了当。相反,std::convertible_to
的 r 值引用 转换要求对于 C++20 功能的简单示例中显示的这种通用概念来说似乎很奇怪。
作为 C++ 的新手,我无法完全理解两个网页中提供的一些术语和部分补充说明,我无法想象两者的要求之间的确切差异。
一些相互关联的问题:
- 类型
From
和 To
不仅受到 std::is_convertible
的限制,而且还受到奇怪的 r 值引用转换要求的实际影响是什么?
From
和 To
的哪些候选类型另外 被 r 值引用转换要求拒绝?
- 为什么程序员可能想要使用
std::is_convertible
或 std::convertible_to
中的一个而不是另一个作为其函数 return 类型或参数类型(除了概念的便利)?
更简单的解释或示例会有所帮助。谢谢!
std::is_convertible<From, To>
(类型特征)检查类型 From
是 隐式 可转换为类型 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>);
根据en.cppreference.com(据我所知):
std::is_convertible
是一个特征 class 要求类型From
&To
是 return 类型To
的函数return一个From
值可以编译。std::convertible_to
是一个概念,要求类型From
和To
如上所述,AND 这样 [=47=From
类型的 ]r 值引用 可以用static_cast<To>
. 转换
std::is_convertible
提出的要求似乎比较直截了当。相反,std::convertible_to
的 r 值引用 转换要求对于 C++20 功能的简单示例中显示的这种通用概念来说似乎很奇怪。
作为 C++ 的新手,我无法完全理解两个网页中提供的一些术语和部分补充说明,我无法想象两者的要求之间的确切差异。
一些相互关联的问题:
- 类型
From
和To
不仅受到std::is_convertible
的限制,而且还受到奇怪的 r 值引用转换要求的实际影响是什么? From
和To
的哪些候选类型另外 被 r 值引用转换要求拒绝?- 为什么程序员可能想要使用
std::is_convertible
或std::convertible_to
中的一个而不是另一个作为其函数 return 类型或参数类型(除了概念的便利)?
更简单的解释或示例会有所帮助。谢谢!
std::is_convertible<From, To>
(类型特征)检查类型 From
是 隐式 可转换为类型 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>);