Связанный массив, установленный функцией универсального - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу установить длину массива равной минимуму константы и универсального типа:

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 голосов
/ 12 ноября 2018

Для int const (&my_array)[std::min(5, foo)] для компиляции вам нужна версия std::min, которая равна constexpr. Это начиная с C ++ 14.

Проверьте значение по умолчанию для -std используемых вами gcc и clang (зависит от версии). В конце концов, скомпилируйте с -std=c++14.

Предоставлено StoryTeller, хорошо работающий MCVE .

0 голосов
/ 12 ноября 2018

Не усложняйте:

[foo < 5 ? foo : 5]
...