Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Недопустимое применение 'sizeof' к типу функции [-Wpointer-arith]

Написал функцию, возвращающую нужное количество байт для выравнивания полей с данным количеством битов. Здесь я возвращаю размер типа:
template < size_t Number_of_bits > size_t aligning_fields() { return sizeof(std::bitset); }
В другой функции получаю размер обьекта этого типа, и делаю это двумя способами, которые отличаются друг от друга только парой скобок:
template < size_t N > size_t flaw(bool b) { return b ? sizeof((std::bitset())) : sizeof(std::bitset()); }
И тут не смог понять предупреждение компилятора, который видите в заголовке вопроса. Можете сказать: "Не пиши так..." Но меня интересует ответ на вопрос: "В чем причина такого поведения?".
Дальше продолжил эксперимент, чтобы выяснить что к чему:
int main() { cout << aligning_fields<33>() <(true) <(false); // 1 return 0; }
Где возник второй вопрос: что возвращает flaw<33>(false)?


Ответ

Вы столкнулись с тем, что называется «Most vexing parse», Ваш код (его false часть) для компилятора является применением sizeof к функции, которая возвращает std::bitset и не имеет аргументов. Но согласно стандарту, применять sizeof к функциям запрещено, поэтому Вы и видите предупреждение. Правда, там должно быть не предупреждение, а ошибка, поэтому gcc поступает плохо, выдавая лишь предупреждение.
В первом же случае (true часть), Вы используете типичную форму записи, которую использовали (до C++11), чтобы убедить компилятор, что это не функция, а создание объекта. Сейчас же в этом нет нужды, т.к. можно (и нужно!) использовать синтаксис с фигурными скобками:
return b ? sizeof((std::bitset{})) : sizeof(std::bitset{});
Но в таком виде эти записи дают идентичный результат и Ваша функция не нужна.

Комментариев нет:

Отправить комментарий