Рассмотрим следующую функцию:
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, эта функция не компилируется, поскольку функция-член размера в массиве не является constexpr из-за того, что она является ссылкой. Сообщение об ошибке таково:
ошибка: нетипизированный аргумент шаблона не является константным выражением
Когда параметры не ссылки, код работает как ожидалось.
Интересно, почему это так, поскольку size () на самом деле возвращает параметр шаблона, вряд ли он может быть более постоянным. Независимо от того, является ли параметр ссылкой или нет, не имеет значения.
Я знаю, что могу, конечно, использовать параметры шаблона S1 и S2, эта функция является лишь краткой иллюстрацией проблемы.
Есть ли что-нибудь в стандарте? Я был очень удивлен, получив из этого ошибку компиляции.