c++ add_rvalue_reference的实现

mwyxok5s  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(80)

为什么直接从函数返回类型推导函数类型时,结果会变成右值引用,而bool_constant中的实现会产生正确的类型?

#include <type_traits>

using namespace std;

template <typename T>
T &&test_rvalue_reference(int);
template <typename T>
T test_rvalue_reference(...);

static_assert(is_same_v<decltype(test_rvalue_reference<void ()>(0)), add_rvalue_reference_t<void ()>>);     // error
static_assert(is_same_v<decltype(test_rvalue_reference<void ()>(0)), void (&)()>);      // OK, lvalue reference

template <typename, typename T>
struct select_second_type {
    using type = T;
};
template <typename T>
typename select_second_type<T &&, true_type>::type try_add_rvalue_reference(int);
template <typename T>
false_type try_add_rvalue_reference(...);

template <typename T, bool = decltype(try_add_rvalue_reference<T>(0))::value>
struct add_right_value_reference {
    using type = T &&;
};
template <typename T>
struct add_right_value_reference<T, false> {
    using type = T;
};

static_assert(is_same_v<typename add_right_value_reference<void ()>::type, add_rvalue_reference_t<void ()>>);       // OK
static_assert(is_same_v<typename add_right_value_reference<void ()>::type, void (&&)()>);       // OK, rvlaue reference

字符串

fgw7neuy

fgw7neuy1#

没有函数右值。名义上具有类型void(&&)()(或任何“函数类型的右值引用”)的表达式实际上仍然是左值,而不是x值。
所以你的decltype(test_rvalue_reference<void ()>(0))void()类型(记住,表达式不能有引用类型),并且是一个左值,所以decltype产生void(&)()
将其与decltype(test_rvalue_reference<int>(0))进行比较:这具有类型int并且是x值,因此decltype产生预期的int&&

相关问题