Это:
void foo(uint8_t a[]) { ... }
это функция, которая принимает uint8_t*
, а не массив - массивы распались к указателям при использовании в качестве аргументов функции. Проблема заключается в том, что список инициализаторов (например, {0x01, 0x02, 0x03}
) не может быть преобразован в uint8_t*
.
Если то, что вы хотите передать произвольное число uint8_t
с до foo
, простое решение заключается в использовании нового std::initializer_list
void foo(std::initializer_list<uint8_t> a) { ... }
foo({0x01, 0x02, 0x03, 0x04, 0x05}); // OK - a has 5 elems in it
Или вы могли бы взять VARIADIC пакет и построить массив из него изнутри :
template <typename... Args,
typename = std::enable_if_t<
all_true<std::is_convertible<Args, uint8_t>::value...>
>>
void foo(Args... elems) {
uint8_t a[] = {elems...};
// ...
}
Это имеет несколько иное использование:
foo({0x01, 0x02, 0x03}); // error
foo(0x01, 0x02, 0x03; // OK - a has 3 elems in it
Проблема была бы яснее, если бы вы избежали запутывающего '' параметра uint8_t [] 'parameter" и вместо этого записывали более точный 'uint8_t *'. :) –
Извините, я обычно использовал форму указателя, но мне было интересно, может ли компилятор выполнить какую-то магию, о которой я не знал, вместо того, чтобы использовать синтаксис массива. – Timmmm
Нет, 100% эквивалентность. –