如何传递临时数组?

Cod*_*cks 5 c++ arrays reference temporary parameter-passing

我怎样才能传递临时数组?我想做这样的事情:

#include <iostream>

int sum(int arr[]) {
    int answer = 0;
    for (const auto& i : arr) {
        answer += i;
    }
    return answer;
}

int main() {
    std::cout << sum( {4, 2} ) << std::endl;       // error
    std::cout << sum( int[]{4, 2} ) << std::endl;  // error
}
Run Code Online (Sandbox Code Playgroud)

我在函数参数的括号中是否需要正整数文字[]?如果我包含该文字,它会限制我可以传递给那个大小的数组的数组吗?另外,如何通过rvalue引用或const引用传递数组元素?因为上面的示例没有编译,我认为制作函数的参数类型int&&[]const int&[]不起作用.

Ker*_* SB 11

首先,您不能数组作为prvalues 传递,因此您的函数需要参考.其次,数组的大小是类型的一部分,因此您的函数可能需要成为模板的一部分.第三,编写数组临时工具在词汇上有点傻,所以你需要一些噪音.

总而言之,以下应该有效

template <std::size_t N>
int sum(const int (&a)[N])
{
    int n = 0;
    for (int i : a) n += i;
    return n;
}

int main()
{
    std::cout << sum({1, 2, 3}) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

使用别名模板可以略微推广语法噪音:

int main()
{
    using X = int[3];
    std::cout << sum(X{1, 2, 3}) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

用法:( sum(X<4>{1, 2, 3, 4})您不能从初始化程序中推导出模板参数.)