c++ cpp静态模板维在前导维可能为零时作为引用传递

fzsnzjdm  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(86)

我有以下功能。

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:

$

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

qco9c6ql

qco9c6ql1#

答案如下:

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数组的引用(因此出现编译错误)。
  • (&A) * 可以 * 替换为A,因为当$m〉0 $时,符号A[m][n]将A作为引用传递。

相关问题