【问题标题】:Differences between std::is_convertible and std::convertible_to (in practice)?std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
【发布时间】:2020-10-19 23:12:45
【问题描述】:

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

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

std::is_convertible 提出的要求似乎相对简单。相反,std::convertible_tor 值引用 强制转换要求对于 C++20 功能的简单示例中显示的这种通用概念来说似乎有些奇怪。

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

一些相互关联的问题:

  • 类型 FromTo 不仅受到 std::is_convertible 的约束,而且还受到奇怪的 r 值引用转换要求的约束,这有什么实际意义?
  • FromTo 的哪些候选类型另外被 r 值参考转换要求拒绝?
  • 为什么程序员可能希望使用std::is_convertiblestd::convertible_to 中的任何一个而不是另一个作为其函数返回类型或参数类型的约束(除了概念的便利性 )?

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

【问题讨论】:

    标签: c++ stl rvalue-reference c++20 c++-concepts


    【解决方案1】:

    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>);
    

    【讨论】:

    • 同意!我想补充一点,当您知道确切的内容时,考虑自定义 requires 子句或概念可能很重要(例如,可能使用 just std::Is_convertible 代替)您需要的要求,因此可以允许接受更多候选类型,而无需使用像 convertible_to 这样的包罗万象的概念!
    • “检查类型 From 是否可隐式转换为类型”是一个类别错误:类型不能转换为 C++ 中的类型 - 尽管有 the library specification says so all over the place - 表达式 可转换为类型。 is_convertible_v&lt;From, To&gt;is_convertible&lt;From, To&gt; 都实际检查表达式 e 使得 decltype((e))From 可转换为类型 To
    • +100 表示“在通用代码中不必担心这种情况很好。” - 标准库概念的大部分意义在于通过正式排除它们来明确我们认为这种病态的情况。
    • -0.1 用于使用not 而不是!
    • @Casey add_rvalue_reference_t&lt;From&gt; :) 我们不关心除了 void 之外的prvalue废话...(编辑:实际上,我们想要remove_cv_t&lt;add_rvalue_reference_t&lt;From&gt;&gt; - LWG 问题提交)
    猜你喜欢
    • 2014-03-04
    • 2013-01-18
    • 2012-04-25
    • 2015-07-21
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多