Этот:
void foo(uint8_t a[]) { ... }
это функция, которая принимает uint8_t*
, а не массив - массивы распадаются на указатели при использовании в качестве аргументов функции. Проблема в том, что список инициализаторов (например, {0x01, 0x02, 0x03}
) нельзя преобразовать в uint8_t*
.
Если вы хотите передать произвольное число uint8_t
s в 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
Или вы можете взять вариативный пакет и построить из него массив внутри:
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
person
Barry
schedule
21.07.2015
uint8_t[]
и вместо него написали более точныйuint8_t*
. :) - person Lightness Races in Orbit   schedule 21.07.2015