关于 std::tuple 对象上 std:get() 的返回类型的混淆
Confusion about the return type of std::get() on std::tuple objects
请看下面的代码(在这里看到它(:
#include <iostream>
#include <tuple>
#include <type_traits>
#include <utility>
struct S {
int&& v;
};
int main() {
std::tuple<int&&> t(1);
std::cout << std::is_same<int, decltype(std::get<0>(t))>{} << std::endl;
std::cout << std::is_same<int&, decltype(std::get<0>(t))>{} << std::endl;
std::cout << std::is_same<int&&, decltype(std::get<0>(t))>{} << std::endl;
S s{1};
std::cout << std::is_same<int&&, decltype(s.v)>{} << std::endl;
}
我希望看到输出0 0 1 1
,但 GCC 和 clang 都给出了输出0 1 0 1
。真的很困惑。有人可以给我一个解释吗?
查看std::get
的签名:
template< std::size_t I, class... Types >
constexpr std::tuple_element_t<I, tuple<Types...> >&
get( tuple<Types...>& t )
template< std::size_t I, class... Types >
constexpr std::tuple_element_t<I, tuple<Types...> >&&
get( tuple<Types...>&& t )
在您的情况下,t
是一个 l 值,因此它返回int&& &
成为 int&
.
相关的std::get
重载如下:
template< std::size_t I, class... Types >
typename std::tuple_element<I, tuple<Types...> >::type&
get( tuple<Types...>& t );
template< std::size_t I, class... Types >
typename std::tuple_element<I, tuple<Types...> >::type&&
get( tuple<Types...>&& t );
请注意,如果参数是左值,则返回左值引用,如果参数是右值,则返回右值引用。 t
是左值,因此返回左值。
相关文章:
- 如何获取std::result_of函数的返回类型
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 推导 std::vector::back() 的返回类型
- 在模板化成员函数的返回类型中使用 std::enable_if 时的编译器差异
- 如何使用 std::invoke_result_t 获取函数的返回类型
- 错误:为"运算符 std::string {aka std::__cxx11::basic_string}"指定的返回类型<char>
- 使用 std::smatch 作为返回类型将导致匹配器变为" 00 00 00 00 00 00 00"
- std::绑定variadic模板和自动返回类型
- 为什么C++哈希函数的返回类型是 std::size_t,而不是独立于平台的类型?
- std::function 中不允许引用返回类型吗?
- 如何在 c++ 中使用返回类型导出函数 std::map
- 返回类型 std::optional<std::variant<...>>
- std::d eclval vs crtp,无法从不完整类型推断方法返回类型
- 为什么C++ std::min_element 库函数接受采用布尔返回类型的函数对象的函子,而不是像 C 中那样的 in
- STD :: SETW,STD :: SETFILL等的真实返回类型是什么?
- 为什么必须STD ::访问具有单一返回类型
- C++14 'auto'能够获取函数返回类型,我们还需要 std::result_of<> 吗?
- 正确使用 std::enable_if 作为返回类型
- 无法使用 std::map 推断 lambda 的返回类型
- 使用 std::function 时选择自动返回类型而不是构造函数的调用运算符