Скажем, у меня есть функция вроде:
int test(std::array<char, 8>* data) {
char buffer[data->size() * 2];
[... some code ...]
}
ясно, размер буфера может быть оценен во время компиляции: данные имеют размер constexpr
из 8 элементов, 8 * 2 = 16 байт.
Однако при компиляции с -Wall
, -pedantic
и -std=c++11
я получаю печально известную ошибку:
предупреждение: массивы переменной длины - это функция C99 [-Wvla-extension]
который, как мне кажется, имеет смысл: array::size()
is constexpr
, но он по-прежнему является методом, и в приведенной выше функции нам еще нужно разыменовать указатель, который не является constexpr
.
Если я попробую что-то вроде:
int test(std::array<char, 8>& data) {
char buffer[data.size() * 2];
[...]
}
gcc
(проверенная версия 5.2.0) кажется счастливой: предупреждения нет.
Но с clang++
(3.5.1) я все еще получаю предупреждение, жалующееся на массивы переменной длины.
В моем случае я не могу легко изменить подпись test
, он должен взять указатель. Итак... несколько вопросов:
-
Каков наилучший/самый стандартный способ получить размер указателя
std::array
в контексте constexpr? -
Является ли разница в поведении с указателями против ожидаемых ссылок? Какой компилятор прав относительно предупреждения,
gcc
илиclang
?