Рассмотрим следующую функцию:
template <size_t S1, size_t S2>
auto concatenate(std::array<uint8_t, S1> &data1, std::array<uint8_t, S2> &data2) {
std::array<uint8_t, data1.size() + data2.size()> result;
auto iter = std::copy(data1.begin(), data1.end(), result.begin());
std::copy(data2.begin(), data2.end(), iter);
return result;
}
int main()
{
std::array<uint8_t, 1> data1{ 0x00 };
std::array<uint8_t, 1> data2{ 0xFF };
auto result = concatenate(data1, data2);
return 0;
}
При компиляции с использованием clang 6.0 и -std = c ++ 17 эта функция не компилируется, поскольку функция-член size в массиве не является constexpr из-за того, что она является ссылкой. Сообщение об ошибке следующее:
ошибка: аргумент шаблона, не являющийся типом, не является постоянным выражением
Когда параметры являются не ссылками, код работает должным образом.
Интересно, почему это могло быть, поскольку size () фактически возвращает параметр шаблона, вряд ли он больше может быть const. Не имеет значения, является ли параметр ссылкой.
Я знаю, что могу, конечно, использовать параметры шаблона S1 и S2, функция является лишь краткой иллюстрацией проблемы.
Есть что-нибудь в стандарте? Я был очень удивлен, когда получил ошибку компиляции.
-std=
флаг вы используете? - person StoryTeller - Unslander Monica   schedule 10.01.2019