【发布时间】:2020-04-25 09:49:04
【问题描述】:
我创建了一个类型验证器来检查给定参数是否为数字。
template<typename T>
struct is_numeric
: std::integral_constant<
bool,
std::is_integral_v<T> || std::is_floating_point_v<T>
> {};
template<typename T>
inline constexpr bool is_numeric_v = is_numeric<T>::value;
template<typename T>
constexpr bool is_numeric_tuple(T&& value)
{ return is_numeric_v<T>; }
// variadic template implementation is omitted
现在的问题是
int i = 3;
is_numeric_tuple(3) // returns true
is_numeric_tuple(i) // returns false
如果我将std::remove_reference 应用到is_numeric_tuple,两个结果都是正确的。
这是否意味着type_traits 的STL 实现如is_integral、is_floating_point 等强制给定类型为右值?
如果是这样,为什么?
更新:
正如 geza 所指出的,我使用的type_traits 库只指定了一个类型本身,这意味着
std::is_integral_v<int>; // returns true
std::is_integral_v<int&>; // returns false
std::is_integral_v<int&&>; // returns false
问题不在于左值或右值。
【问题讨论】: