gpt4 book ai didi

左值和右值上的 C++ std::is_integral 显示不同的结果

转载 作者:行者123 更新时间:2023-12-01 14:07:38 27 4
gpt4 key购买 nike

我创建了一个类型验证器来检查给定的参数是否是数字。

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_referenceis_numeric_tuple ,结果证明这两个结果都是正确的。

是否意味着 type_traits的STL实现?喜欢 is_integral , is_floating_point等强制给定类型为右值?

如果是这样,为什么?

更新 :

正如 所指出的格扎 , type_traits我使用的库只指定了一个类型本身,这意味着
std::is_integral_v<int>;    // returns true
std::is_integral_v<int&>; // returns false
std::is_integral_v<int&&>; // returns false

问题不在于左值或右值。

最佳答案

似乎您正在混淆值类别和类型。这些有很强的联系,但又不一样。
type_traits需要一个 类型 范围。在这里讨论右值没有意义,如 表达式 有值类别。
is_integral需要一个非引用类型来返回 true . is_integral_v<int &&> (右值引用)仍然返回 false ,因为它是一个引用类型。

在您的第一个示例(文字 3 )中, T将被推导出为 int , 也是 is_numeric_tuple将返回 true (因为它是非引用类型)。

在你的第二个例子中,T将被推导出为 int & ,所以它会返回 false (因为它是引用类型)。

关于左值和右值上的 C++ std::is_integral 显示不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61423799/

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