我想将数组长度设置为常量和泛型的最小值:
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
看起来都类似。
答案 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]