提问人:kaisong 提问时间:1/26/2023 最后编辑:gonideliskaisong 更新时间:2/1/2023 访问量:46
CPP 静态模板维度传递作为参考(当前导维度可能为零时)
cpp static template-dimension pass-as-reference when leading dimension may be zero
问:
我有以下功能。
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
答:
-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)
A
A[m][n]
评论
0赞
apple apple
1/30/2023
好吧,尽管它没有传递引用,但您丢失了维度信息,无法推断出二元信息,即使没有标志,它也不会真正在 clang 中编译。
评论