gpt4 book ai didi

c++ - 为什么 std::derived_from 概念是通过添加 cv 限定符的附加可转换性测试来实现的?

转载 作者:行者123 更新时间:2023-12-03 10:03:21 27 4
gpt4 key购买 nike

在 GCC C++20 概念库中,它有

template<typename _Derived, typename _Base>
concept derived_from = __is_base_of(_Base, _Derived)
&& is_convertible_v<const volatile _Derived*, const volatile _Base*>;
  • 为什么只需要 __is_base_of(_Base, _Derived)不够?
  • 有什么需要使用const volatile在测试中?
  • 最佳答案

    std::derived_from 的行为根据 unambiguous public inheritance 指定

    The concept derived_from<Derived, Base> is satisfied if and only ifBase is a class type that is either Derived or a public andunambiguous base of Derived, ignoring cv-qualifiers.

    Note that this behaviour is different to std::is_base_of when Baseis a private or protected base of Derived.

    __is_base_of是用于实现 std::is_base_of 的编译器内在函数.因此,单独使用它不会产生所需的行为。
    因此,为了检查需求的“明确的公共(public)”部分,我们可以检查指向派生对象的指针是否可以隐式转换为指向基础对象的指针。这只是 C++ 类的标准过程。如果类建模“is-a”关系、公共(public)继承而不是来自多个基类,则指针是可转换的。 const volatile另外是处理“忽略cv-qualifiers”的要求。通过总是添加它们,转换是合法的,即使例如 _DerivedB const对一些 A (非常量) _Base .按原样比较指针将尝试转换 B const*A* , 并且会因为丢弃的 cv 限定符而失败。

    关于c++ - 为什么 std::derived_from 概念是通过添加 cv 限定符的附加可转换性测试来实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65915059/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com