CPP 静态模板维度传递作为参考(当前导维度可能为零时)

cpp static template-dimension pass-as-reference when leading dimension may be zero

提问人:kaisong 提问时间:1/26/2023 最后编辑:gonideliskaisong 更新时间:2/1/2023 访问量:46

问:

我有以下功能。

template<int m, int n>
void foo(float (&A)[m][n]){}

int main(){
    float x[3][4], y[0][4];
    
    foo<3,4>(x);
    //if(false){ foo<0,4>(y); } // POSITION 1
}

当我取消注释包含的行时,将引发以下错误:POSITION 1

$ g++ minimum_example.cpp

.\minimum_example.cpp: In function 'int main()':
.\minimum_example.cpp:10:13: error: no matching function for call to 'foo<0, 4>(float [0][4])'
   10 |     foo<0,4>(y);
      |     ~~~~~~~~^~~
.\minimum_example.cpp:3:6: note: candidate: 'template<int m, int n> void foo(float (&)[m][n])'
    3 | void foo(float (&A)[m][n]){}
      |      ^~~
.\minimum_example.cpp:3:6: note:   template argument deduction/substitution failed:

$

问题是我无法在编译时捕获异常。 最好,我对不改变 main() POV 的调用语法的解决方案感兴趣。m==0

C++ 模板 多维数组 按引用传递

评论

0赞 apple apple 1/26/2023
零大小的阵列是非标准的

答:

-1赞 kaisong 1/29/2023 #1

答案如下:

template<int m, int n>
void foo(float A[m][n]){}

int main(){
    float x[3][4], y[0][4];
    
    foo<3,4>(x);
    //if(false){ foo<0,4>(y); } // POSITION 1
}

也就是说,您只需替换为第 2 行。(&A)A

原因如下:

  • 在这件事上,违反标准没有实际意义,因为代码在 GCC 和 CLANG 中完全按照它应该做的事情去做。
  • 无法显式传递引用,因为无法生成对 NULL 数组的引用(因此会出现编译错误)。
  • 可以替换为 因为当 $m>0$ 时,表示法会传递 A 作为引用。(&A)AA[m][n]

评论

0赞 apple apple 1/30/2023
好吧,尽管它没有传递引用,但您丢失了维度信息,无法推断出二元信息,即使没有标志,它也不会真正在 clang 中编译