当前位置: 首页 > 知识库问答 >
问题:

将C样式数组传递给`span`

穆鸿卓
2023-03-14
size_t size(std::span<int> s)
{
    return s.size();
}

int main()
{
    std::array arr = {1,2,3,4,5};
    std::vector vec = {1,2,3,4,5};
    auto il = {1,2,3,4,5};
    int c_arr[] = {1,2,3,4,5};
    std::cout << size(arr) << size(vec) << size(il) << size(c_arr);
}
template<typename T>
size_t size(std::span<T> s)
{
    return s.size();
}

int main()
{
    std::array arr = {1,2,3,4,5};
    std::vector vec = {1,2,3,4,5};
    auto il = {1,2,3,4,5};
    int c_arr[] = {1,2,3,4,5};
    std::cout << size(arr) << size(vec) << size(il) << size(c_arr);
                                                       ^^^^^^^^^^^
    // error: no matching function for call to 'size(int [5])'
    // note: template argument deduction/substitution failed:
    // note: mismatched types 'std::span<_Type, 18446744073709551615>' and 'int*'
}

这是正确的行为吗?如果是这样,有没有办法接受带有span 的C样式数组?

共有1个答案

李开宇
2023-03-14

问题不是为什么这对int[]失败,而是为什么它对所有其他类型都有效!不幸的是,ADL实际上调用的是std::size,而不是您编写的size函数。这是因为函数的所有重载都失败了,所以它会在第一个参数的命名空间中查找匹配函数,并在其中找到std::size。重新运行程序,将函数重命名为其他函数:

template<typename T>
size_t my_size(std::span<T> s)
{
    return s.size();
}

在gcc 12上我得到

prog.cc:18:25: error: no matching function for call to 'my_size(std::array<int, 5>&)'
   18 |     std::cout << my_size(arr) << my_size(vec) << my_size(il) << my_size(c_arr);
      |                  ~~~~~~~^~~~~
prog.cc:7:8: note: candidate: 'template<class T> size_t my_size(std::span<_Type, 18446744073709551615>)'
    7 | size_t my_size(std::span<T> s)
      |        ^~~~~~~
prog.cc:7:8: note:   template argument deduction/substitution failed:
prog.cc:18:25: note:   'std::array<int, 5>' is not derived from 'std::span<_Type, 18446744073709551615>'
   18 |     std::cout << my_size(arr) << my_size(vec) << my_size(il) << my_size(c_arr);
      |                  ~~~~~~~^~~~~

加上所有其他类型的类似错误。如果你的问题是为什么会失败;那么简单的回答是,模板类型的推导比常规类型的推导严格得多,所以除非给它一个精确的匹配(或多或少),否则它将失败。要了解更详细的解释,请阅读类似的问题,比如这个问题,它涉及类似的事情

 类似资料:
  • 问题内容: 有谁知道如何将C#ASP.NET数组传递给JavaScript数组?示例代码也将很好。 对不起,如果我以前的人含糊不清。这个问题实际上很简单。为了简单起见,我在文件中声明: 现在,我想传递给客户端,并在JavaScript中使用数组中的数据。我该怎么做? 问题答案: 您可以使用ClientScript.RegisterStartUpScript将javascript注入Page_Loa

  • C++ 数组 C++ 中您可以通过指定不带索引的数组名来传递一个指向数组的指针。 C++ 传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。 如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。 方式 1 形式参数是一个指针:

  • 问题内容: 我有一个C函数声明如下: 如今,我的cython包装器代码使用了numpy数组中的缓冲区语法: 我想使用新的memoryview语法,我的问题是,使用memoryview时如何将指针传递给数据? 我试过了: 当我尝试编译模块时,出现了“无法将类型’long [:]’分配给’long *’”的错误。有没有什么方法可以在调用C函数之前将指针传递给numpy数组而不将其强制转换为numpy数

  • 问题内容: 我在烧瓶中有一个称为数组的函数,该函数接收一个列表并打印出列表中的项目: 在客户端,我想将名为str的javascript数组传递给该数组。我该怎么办?这就是我现在所拥有的,但是Flask没有读取添加的变量。有任何想法吗? 问题答案: Flask具有一个称为request的内置对象。在请求中有一个称为args的multidict。 您可以用来检索查询字符串的值。 当然,这需要一个get

  • 本文向大家介绍怎样将事件传递给子组件?相关面试题,主要包含被问及怎样将事件传递给子组件?时的应答技巧和注意事项,需要的朋友参考一下 这道题出的有问题。 一般情况下我们父组件向子组件传递的不是事件,而是事件处理函数

  • 要将数组参数传递给函数,需指定不带方括号的数组名。例如,如果数组hourlyTemperatures声明如下: int hourlyTemperatures[24]; 则下列函数调用语句: modifyArray(hourlyTemperatutes,24); 将数组 hourlyTemperatures 及其长度传递给函数 modifyArray。将数组传递给函数时,通常也将其长度传递给函数,使