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

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

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

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

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

Ответ 1

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

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

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