Важное замечание: ниже приведен псевдокод. аргументы для sizeof фактически никогда не оцениваются , что означает «выполнено», это всегда конструкция времени компиляции (и, следовательно, один из инструментов, предпочитаемых авторами шаблонов, например, перечисления).
обратите внимание, что я позаимствовал auto
ниже у C ++ (0x); он говорит компилятору выводить тип из выражения инициализатора и упрощает примеры
Что многие не знают, так это то, что вы можете вызывать sizeof
действительно так:
auto s = sizeof int;
Т.е., скобки не нужны. Следовательно, если вы передадите (x, y) sizeof
, это эквивалентно
auto c = (x,y);
auto s = sizeof c;
или просто
auto c = x,y;
auto s = sizeof c;
x,y
- это последовательность, где каждая часть оценивается слева направо, и последовательность получает значение последней части, в данном случае это y
. Итак, исходный код примерно эквивалентен
auto s = sizeof y;
Так что мне кажется, что рассматриваемый компилятор действительно делает что-то действительно мозговое, так как он вводит расширение, которое также компилируется в других компиляторах, но с совершенно другим значением. Это плохо.