gpt4 book ai didi

c++ - 为什么 C++ 中的类型可转换性不可传递?

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:14 26 4
gpt4 key购买 nike

考虑以下静态断言:

    static_assert(std::is_convertible_v<int const&, int const>);
static_assert(std::is_convertible_v<int const, int>);
static_assert(std::is_convertible_v<int, int &&>);

static_assert(std::is_convertible_v<int const&, int &&>);

以上三个断言通过,最后一个断言失败。

这意味着 C++ 中的类型可转换性一般来说是不可传递的,我认为这是非常违反直觉的。

我搜索了标准和 cppreference 网站以找到任何证据表明这是有意的行为,但到目前为止我还没有成功。

有趣的是,对于左值引用,一切都很好,因为 std::is_convertible_v<int, int&>是假的。对于右值引用,我也希望如此。

我认为它与 is_convertible 的方式有关被定义为。在定义中,To参数显示为虚构函数的返回类型。根据我的理解,任何类型的新值都是临时的,因此可以转换为右值引用。为此std::is_convertible_v<T, T&&>适用于任何类型 T .

所以更具体地说,我问以下问题:

  1. 是否is_convertible真的捕获了可兑换性的直觉吗?
  2. 如果没有,它还能捕获什么?或者换句话说:我对可兑换性的直觉不合适吗?
  3. 如果我们理解is_convertible作为二元关系,它不应该是一个预序,即传递吗?为什么不呢?

直觉上,恕我直言,可转换性应该意味着:每当一个类型 To是必需的,您也可以使用类型 From .这意味着传递性。

特别是,T不应转换为 T&& , 因为你不能使用 T其中 T&&是必需的(例如,您可能不会从 T 移动,但您可以从 T&& 移动)。

我这里有严重错误吗?

最佳答案

Intuitively, imho, convertiblity should mean: whenever a type To is required, you can also use type From....

这就是它的意思。

...And this would imply transitivity.

不,这是不正确的。并非每个二元关系都必须具有传递性。来自 cppreferene关于隐式转换:

Implicit conversion sequence consists of the following, in this order:

1) zero or one standard conversion sequence;

2) zero or one user-defined conversion;

3) zero or one standard conversion sequence.

When considering the argument to a constructor or to a user-defined conversion function, only one standard conversion sequence is allowed (otherwise user-defined conversions could be effectively chained). When converting from one built-in type to another built-in type, only one standard conversion sequence is allowed.

确切的规则相当复杂,但考虑“零个或一个用户定义的转换”;所以当你有用户定义的从 FooBar 和从 BarBaz 的转换时,这并不一定意味着Foo 转换为 Baz!

不是 std::is_convertible 有一个奇怪的可转换概念,而是 C++ 中关于什么是可转换的规则从一开始就不是可传递的。

关于c++ - 为什么 C++ 中的类型可转换性不可传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55689484/

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