为什么 C++ 不允许使用 std::pair<int[], int[]>?

6
为什么下面的C++代码无法编译?
#include <utility>

int main() {
    int x[6];
    int y[6];
    std::pair<int[6], int[6]> a(x, y);
    return 0;
}

例如,MSVC会给出以下错误:

error C2661: 'std::pair<int [6],int [6]>::pair': 没有重载函数使用 2 个参数

谢谢您的评论,说明使用C++替代构造数组的方式,但我也想知道代码无法编译的原因。

4
使用std::array<int,6>代替c数组:https://ideone.com/eEKplR - drescherjm
2
@BRemmelzwaal: int[6] 确实是一种类型。 - Ben Voigt
3
C风格的数组在许多情况下要么不起作用,要么表现不符合预期。建议使用C++的替代方法。 - Drew Dormann
1
当数组作为参数传递给函数时,它会衰变成指针,结果是 int*。这意味着 int* != int[6]。你应该使用 std::array<int,6> 或自己将其包装到结构体中。 - Raildex
4
在C++中,数组不可复制(即,如果ab是数组,则不能写成a = b;)。这使得在模板(和许多其他地方)中使用它们变得棘手。 - john
显示剩余2条评论
1个回答

13
使用int[]作为std::pair中的元素类型是允许的。
例如,你可以这样使用:
std::pair<int[6], int[6]> a;
a.first[0] = 1;

不合法的是使用`(x,y)`对pair进行初始化。C数组不可复制赋值:你不能通过简单的赋值`a1 = a2;`将一个数组`a2`赋值给另一个数组`a1`。而且当传递给函数/方法时,C数组会衰变为指针。
然而,在C++中,首选的方法是使用`std::array`:
#include <utility>
#include <array>

using IntArr6 = std::array<int, 6>;
IntArr6 x{ 1,2,3,4,5,6 };
IntArr6 y{ 11,22,33,44,55,66 };
std::pair<IntArr6, IntArr6> aa{ x,y };

请注意使用using(提供type alias)来使代码更易读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接