gpt4 book ai didi

c++ - 获取 c 数组上 begin 的返回类型

转载 作者:可可西里 更新时间:2023-11-01 16:09:22 26 4
gpt4 key购买 nike

我想获得 std::begin 的返回类型以一种通用的方式。我目前的解决方案是:

using type = decltype(std::begin(std::declval<T>()));

它在 T = std::vector<int> 时有效.但我不明白为什么以下内容不起作用:

using type = decltype(std::begin(std::declval<int[3]>()));

我得到错误:

example.cpp:83:60: error: no matching function for call to ‘begin(int [3])’
using type = decltype(std::begin(std::declval<int[3]>()));

如何获取std::begin的返回类型以一种通用的方式?

最佳答案

arrays 的过载是:

template< class T, std::size_t N > 
constexpr T* begin( T (&array)[N] );

std::declval<int[3]>()给你一个 int(&&)[3] ,与该重载不匹配。它也不符合正常的容器过载,因为那些是 SFINAE 编辑的 c.begin() .所以你没有匹配的函数。

您需要的是将对数组的左值 引用传递给begin()。 , 让迭代器退出。因此,要么您需要在使用别名时手动提供该左值引用:

template <class T>
using type = decltype(std::begin(std::declval<T>()));

using arr = type<int(&)[3]>; // int*

或者让别名本身为您提供左值引用:

template <class T>
using type = decltype(std::begin(std::declval<T&>()));

using arr = type<int[3]>; // int*

前者对我来说似乎更正确,但是 YMMV。

关于c++ - 获取 c 数组上 begin 的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42009467/

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