2016-07-26 2 views
-2

У меня есть следующий рекурсивный constexpr функциюКак этот код производит целое число без знака переливных

template<size_t N, size_t O,size_t All> 
constexpr int get_indices(const std::array<size_t,N> &products, 
          const std::array<size_t,N>& idx, 
          const std::array<std::array<int,O>,All> &as_all, 
          int i, 
          int it) { 

    return it==0 ? as_all[i][idx[static_cast<int>(N)-1]] : 
     products[it]*as_all[i][idx[it]] + 
     get_indices(products,idx,as_all,i,it-1); 
} 

при вызове с

constexpr std::array<size_t,2> products = {2,0}; 
constexpr std::array<size_t,2> idx = {0,1}; 
constexpr std::array<std::array<int,3>,8> as_all = {{{0, 0, 0}, 
     {0, 0, 1}, 
     {0, 1, 0}, 
     {0, 1, 1}, 
     {1, 0, 0}, 
     {1, 0, 1}, 
     {1, 1, 0}, 
     {1, 1, 1}}}; 

get_indices(products,idx,as_all,4,2); // call it 

он производит, результаты мусора. Я думаю, что это проблема неподписанного переполнения, но я не совсем уверен, как это происходит. Я проверил с gcc и clang.

+3

Пожалуйста, покажите нам полную автономную программу, выход которой показывает проблему вместе с фактическим выходом. –

+2

Почему люди не могут следовать простым инструкциям? Всегда нужно запрашивать MCVE. Вздох. –

ответ

2

У вас есть запретный доступ, лязг и НКА даже сказать вам, что:

live example

main.cpp:28:15: error: constexpr variable 'x' must be initialized by a constant expression 

constexpr int x = get_indices(products,idx,as_all,4,2); 
      ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

main.cpp:11:9: note: read of dereferenced one-past-the-end pointer is not allowed in a constant expression 
     products[it]*as_all[i][idx[it]] + 
     ^

Проблема заключается в том, что вы пытаетесь получить доступ к idx[2] в то время как его размер 2 , так что вы можете получить доступ только idx[0] или idx[1]

Смежные вопросы