Что происходит с 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 (или любого другого места, в котором ожидается выражение). Однако, как правило, он не делает для самого чистого кода, и семантика нечетна. Как вы заметили, последовательность, разделенная запятыми, оценивает значение последнего выражения.