Что случилось со static_cast с несколькими аргументами? - PullRequest
11 голосов
/ 27 февраля 2009

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

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

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

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

1 Ответ

30 голосов
/ 27 февраля 2009

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

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

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

...