Что случилось со static_cast с несколькими аргументами?

Может кто-нибудь сказать мне, что это приведение имеет для эффекта (помимо установки happyNumber 1337), если таковые вообще имеются, и если это не имеет никакого другого эффекта, почему я могу написать код, подобный этому??? Это ошибка компилятора или какая-то "скрытая особенность" C++?

int happyNumber = static_cast<int>(123.456, TRUE, "WTF" , false , "IS" , NULL , "GOING" , 0xff , "ON???" , 1337);

Я был удивлен, что это скомпилируется вообще. Я обнаружил это через ошибку, когда случайно установил второй параметр во что-то, что предназначалось для вызова функции вызываемого выражения. Это привело к неприятной ошибке, когда объект был приведен из второго параметра, вызывая функцию только с одним аргументом. Это скомпилировано... И изначально не бум...

Я использую Microsoft Visual C++ 2008.

1 ответ

Решение

Статическое приведение принимает один аргумент, но его аргумент является выражением, и выражения могут включать оператор запятой. Запятая используется в ситуациях, когда вы хотите оценить два или более выражений одновременно для их побочных эффектов, например:

int i, j;
for (i=0, j=0; i < 10; i++,j++) {
    // do stuff
}

Это несколько полезно, потому что без него вы можете оценить только одно выражение для инициализатора, условия и продолжения части цикла for (или любого другого места, где ожидается выражение). Хотя обычно это не самый понятный код, а семантика странная. Как вы заметили, разделенная запятыми последовательность оценивается как значение ее последнего выражения.

Другие вопросы по тегам