为什么 '''is_assignable_v<int, int>''' 和 '''is_assignable_v<int&, int>''' 有不同的结果?

Why does the ```is_assignable_v<int, int>``` and ```is_assignable_v<int&, int>``` have different result?

提问人:myoldgrandpa 提问时间:9/4/2023 最后编辑:HolyBlackCatmyoldgrandpa 更新时间:9/13/2023 访问量:35

问:

为什么 和 有不同的结果? 返回 true,但返回 false。这不是很直观。is_assignable_v<int, int>is_assignable_v<int&, int>is_assignable_v<int&, int>is_assignable_v<int, int>

is_assignable_v根据定义,来自 cppreference.com。 这意味着,返回 false 但返回 true。std::declval<T>() = std::declval<U>()std:declval<int>() = std::declval<int>()std:declval<int&>() = std::declval<int>()

std::declval<int>()是 int 的右值。那是什么意思呢?如果它意味着对右值 int 的引用,那么是否可以引用没有 const 的 int 可以引用右值?std::declval<int&>()

我完全困惑. 你能为我解释一下吗?is_assignable_v

C++ 模板 C++17 类型特征

评论


答:

1赞 HolyBlackCat 9/4/2023 #1

std::declval<int>()的右值为 。那是什么意思呢?intstd::declval<int&>()

Lvalue ,由于引用折叠int

对于标量类型,只能赋值给左值,而不能赋值为右值。对于类,默认情况下也可以赋值给右值,除非您有意阻止这样做。

请注意,不能通过分配给引用来重新定位引用,而是分配给引用指向的任何内容。

另请注意,表达式不能有引用类型,因此尝试赋值给“引用”与尝试赋值给左值(或右值)没有什么不同。intint