gpt4 book ai didi

c++ - std::common_type 应该使用 std::decay 吗?

转载 作者:IT老高 更新时间:2023-10-28 22:21:23 27 4
gpt4 key购买 nike

给定类型 A,B , 我关心 std::common_type<A,B> 的确切定义, 不考虑可变参数 std::common_type<A...>对于任意类型 A... .所以让

using T = decltype(true ? std::declval<A>() : std::declval<B>());
using C = std::common_type<A,B>;

现在,根据一些消息来源,我发现了以下关系(为简洁起见,跳过typename):

  • cppreference.com : C::type = std::decay<T>::type

  • cplusplus.com : C::type = T

  • GCC 4.8.1 <type_traits>实现:C::type = std::decay<T>::type如果 T有效,否则C不包含 ::type成员(“SFINAE 友好”)

  • Clang 3.3 <type_traits>实现:C::type = std::remove_reference<T>::type

我发现 GCC 的“SFINAE 友好”版本是一个小细节,而 std::remove_referencestd::decay实际上只在内置数组和函数以及 cv 限定方面有所不同,对此我也不太关心。所以我的问题是

应该是decay<T>::type或只是 T ?使用 decay<T>::type 的理由是什么? ?是否仅代表结果A() + B()例如算术表达式?

例如,经过一番试验,我发现在“just T”定义的情况下,我们有

common_type<int&,int&> = int&
common_type<int&,long&> = long

也就是说,如果类型相等,则维护一个左值引用。这反射(reflect)了这样一个事实:

int a, b;
(true ? a : b) = 0;

有效,而

int a;
long b;
(true ? a : b) = 0;

不是。这种“如果类型相等则允许赋值”的语义正是我在一个应用程序中所需要的,我倾向于相信 common_typedecay应该是两个独立的步骤。我应该只使用我自己的定义吗?

最佳答案

should std::common_type use std::decay?

是的,见 Library Working Group Defect #2141 .

短版(长版,见上面的链接):

  • declval<A>()返回 A&&

  • common_type通过 declval 指定, n3337:

    template <class T, class U>
    struct common_type<T, U> {
    typedef decltype(true ? declval<T>() : declval<U>()) type;
    };
  • common_type<int, int>::type因此产生 int&& ,这是意料之外的

  • 建议的解决方案是添加decay

    template <class T, class U>
    struct common_type<T, U> {
    typedef decay_t < decltype(true ? declval<T>() : declval<U>()) > type;
    };
  • common_type<int, int>::type现在产生 int

关于c++ - std::common_type 应该使用 std::decay 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21975812/

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