gpt4 book ai didi

c++ - std::is_convertible 是协变的还是逆变的?

转载 作者:行者123 更新时间:2023-11-30 02:21:04 47 4
gpt4 key购买 nike

根据 cppreference , std::is_convertible< From, To >应该表现得好像以下虚函数是良构的:

template < class To, class From >
To test() {
return std::declval< From >();
}

这意味着 std::is_convertible< From, To >::value应评估为 true如果ToFrom 协变(换句话说,当 FromTo 的基类时, std::is_convertible< From, To >::value 应该评估为 true )。

假设我们有两个类。

struct Base {};

struct Derived : public Base {};

现在,如果我们调用假想的测试方法,test< Base*, Derived* >()test< Derived*, Base* >()实际上是结构良好的,因为即使正式返回类型是指向基类的指针,您也可以返回指向派生类的指针。但是 is_convertible< Base*, Derived* > 的结果和 is_convertible< Derived*, Base* >会有所不同(std::is_convertible_v< Base*, Derived* > 等于 false。这个特征的描述准确吗?

编辑

这是我尝试实现 is_convertible性状

template < class T, class U >
U convert() {
return std::declval< T >();
}

template < class T, class U, bool isTVoid = std::is_void_v< T >, bool isUVoid = std::is_void_v< U >, class = void >
struct is_convertible_helper
: public std::false_type {};

template < class T, class U >
struct is_convertible_helper< T, U, false, false, std::void_t< decltype(convert< T, U >()) > >
: public std::true_type {};

template < class T, class U >
struct is_convertible_helper< T, U, false, true, void >
: public std::false_type {};

template < class T, class U >
struct is_convertible_helper< T, U, true, false, void >
: public std::false_type {};

template < class T, class U >
struct is_convertible_helper< T, U, true, true, void >
: public std::true_type {};

template < class T, class U >
struct is_convertible
: public is_convertible_helper< T, U > {};

我问这个问题的原因是,is_convertible< A*, B* >::valueis_convertible< B*, A* >::value评估为 true .

最佳答案

both test< Base*, Derived* >() and test< Derived*, Base* >() will actually be well formed.

不正确。

test<Derived*, Base*>()Base* 以来格式不正确无法转换为 Derived* .

https://ideone.com/N73ROY 查看问题.

But result of is_convertible< Base*, Derived* > and is_convertible< Derived*, Base* > will differ (std::is_convertible_v< Base*, Derived* > is equal to false)

这是正确的行为。

Is the description of this trait accurate?

是的。


您的困惑源于第一句话。因为那是不正确的,所以其余的答案应该是有道理的。

关于c++ - std::is_convertible 是协变的还是逆变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967715/

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