【问题标题】:Argument of type int[8][8] gets turned into int(*)[8]int[8][8] 类型的参数变成 int(*)[8]
【发布时间】:2021-06-04 22:33:02
【问题描述】:
using T=int[8][8];    //1
                      //2
T a={0};              //3
void f(T b){          //4
     a=b;             //5 
}                     //6

即使在调用函数 f 时 a 和 b 都应该是 T 类型, 我的编译器说第 5 行有一个错误:“将 'int(*)[8]' 分配给 'T' {aka 'int [8][8]'} 时的类型不兼容”。 为什么 b 不像我在第 4 行中声明的那样属于 T 类型?

【问题讨论】:

  • 您不能将一个数组分配给另一个数组。你需要复制。
  • 这是标准的。将参数声明为数组将始终将其视为指针,因为数组指向指针 decay
  • 但主要问题不是衰减,而是您尝试分配给无效的数组(如前所述)。如果您需要分配给数组,请使用std::vectorstd::array

标签: c++ arrays types


【解决方案1】:

在 C++(和 C)中,您不能将数组按值传递给函数。如果您声明一个以数组为参数的函数,则参数的类型将“调整”为指针。因此,您的论点是一个指针。您可以通过引用传递它:

void f(T const& b);

这将是一个数组引用,但您不能真正使用= 来分配一个数组。您可以使用循环 memcpystd::copy 来执行此操作。或者,您可以使用 std::array 来获得友好的值语义:

using T = std::array<std::array<int, 8>, 8>;
                      
T a; 
void f(T const& b) { // could also pass by value
     a = b; // assignment is OK
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多