Написал функцию, возвращающую нужное количество байт для выравнивания полей с данным количеством битов. Здесь я возвращаю размер типа:
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
И тут не смог понять предупреждение компилятора, который видите в заголовке вопроса. Можете сказать: "Не пиши так..." Но меня интересует ответ на вопрос: "В чем причина такого поведения?".
Дальше продолжил эксперимент, чтобы выяснить что к чему:
int main()
{
cout << aligning_fields<33>() <
Где возник второй вопрос: что возвращает flaw<33>(false)?
Ответ
Вы столкнулись с тем, что называется «Most vexing parse», Ваш код (его false часть) для компилятора является применением sizeof к функции, которая возвращает std::bitset
В первом же случае (true часть), Вы используете типичную форму записи, которую использовали (до C++11), чтобы убедить компилятор, что это не функция, а создание объекта. Сейчас же в этом нет нужды, т.к. можно (и нужно!) использовать синтаксис с фигурными скобками:
return b ? sizeof((std::bitset
Но в таком виде эти записи дают идентичный результат и Ваша функция не нужна.
Комментариев нет:
Отправить комментарий