为什么直接从函数返回类型推导函数类型时,结果会变成右值引用,而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
字符串
1条答案
按热度按时间fgw7neuy1#
没有函数右值。名义上具有类型
void(&&)()
(或任何“函数类型的右值引用”)的表达式实际上仍然是左值,而不是x值。所以你的
decltype(test_rvalue_reference<void ()>(0))
有void()
类型(记住,表达式不能有引用类型),并且是一个左值,所以decltype产生void(&)()
。将其与
decltype(test_rvalue_reference<int>(0))
进行比较:这具有类型int
并且是x值,因此decltype产生预期的int&&
。