Скажем, у меня есть функция вроде:
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?