由泛型函数设置的数组绑定

时间:2018-11-12 12:35:45

标签: c++ g++ clang++

我想将数组长度设置为常量和泛型的最小值:

template <int foo> struct Bar{
  void my_func( int const (&my_array)[std::min(5, foo)] ) { /*...*/ }
};

此代码可使用clang ++编译,但不能使用g ++编译,我需要我的代码才能同时使用两者。 g ++给出的错误是:error: array bound is not an integer constant before ']' token。如何设置此数组的长度为foo和5的最小值?

当我使用clang ++时,遇到了无法将任何东西绑定到my_array的问题。我想运行类似的东西:

int main() {
  static const int var[5] = {0,1,2,3,4};
  Bar<5> bar;
  bar.my_func(var);
}

但是当我尝试在clang ++中编译此代码时,我得到了error: reference to type 'const int [*]' could not bind to an lvalue of type 'const int [5]'

如果我摆脱了std::min()的东西,并用foo替换了代码,则代码可以编译并运行良好。

注释: 要编译此代码,您需要#include <algorithm>或类似权限才能访问std::min

我认为作为模板的一部分并不重要,但是当我尝试使用非模板功能进行类似的操作时,例如:

const int const_five = 5;
void new_func( int const (&my_array)[std::min(5,const_five)] ) { /*...*/ }

g ++表示:error: variable or field 'new_func' declared void和clang ++表示candidate function not viable: no known conversion from 'const int [5]' to 'const int [std::min(5, const_five)]' for 1st argument看起来都类似。

2 个答案:

答案 0 :(得分:2)

要编译int const (&my_array)[std::min(5, foo)],您需要std::min的一个版本,即constexpr。从C ++ 14开始。

检查您使用的gcc和clang的-std的默认值(取决于版本)。最终,使用-std=c++14进行编译。

由Story nice working MCVE的StoryTeller提供。

答案 1 :(得分:1)

保持简单:

[foo < 5 ? foo : 5]