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