Рассмотрим этот код:Позвони constexpr функцию принятия массива не удается скомпилировать
#include <array>
template < int... Ints >
constexpr std::array<int,sizeof...(Ints)> theIntArray = {Ints...};
template < size_t NN >
constexpr void test(const std::array<int,NN>& xx)
{
theIntArray<xx[0]>;
}
constexpr std::array<int,2> aa = {10,20};
int main()
{
theIntArray<aa[0]>; // passes
test(aa); // FAILS ?!
return 0;
}
В функции main()
первая линия проходит в то время как вторая линия не может со странным сообщением об ошибке:
error: ‘* & xx’ is not a constant expression
note: in template argument for type ‘int’
Я использую gcc-7.0.1, и вы можете найти живой пример here.
Это в соответствии со стандартом или это ошибка? Что делает вторую строку неудачной, пока проходит первая строка?
TIL добавляет константу-ссылку к типу литерала, чтобы имитировать определяемый пользователем параметр непигового шаблона. upvoted. – TemplateRex