静态转换(static_cast)在多个参数时有什么问题?

14

除了将happyNumber设置为1337之外,这个转换还有什么效果(如果有的话),如果没有其他效果,那我怎么能编写像这样的代码?这是编译器bug还是C++的“隐藏特性”?

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

我很惊讶这段代码居然能编译通过。我是在一个错误中发现它的,当时我不小心把第二个参数设置成了应该用于函数调用的表达式。由此导致了一个令人头痛的bug,对象从第二个参数处被转换并只传入了一个参数。它竟然还能编译通过……一开始也没有出错。

我正在使用Microsoft Visual C++ 2008。


这是完全合法的,没有任何错误。 - Anonymous
啊,是的,你说得对。当时我感到非常困惑,以至于我“知道”这一定是编译器的错误 - 但实际上并不是 :) 我以前从未遇到过逗号运算符。 - Statement
1个回答

31

static_cast只接受一个参数,但它的参数是一个表达式,而表达式可以包含逗号运算符。逗号用于在你想同时评估两个或多个表达式以获取它们的副作用时使用,例如:

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

这个功能有一定的用处,因为如果没有它,你只能为for循环(或任何需要表达式的地方)的初始化、条件和继续部分分别评估一个表达式。但通常这样不会产生最清晰的代码,而且语义也有些奇怪。正如你所观察到的,逗号分隔的序列将计算为其最后一个表达式的值。


我理解在for语法中的用法,但是我无法领会在static_cast中的功能。 - Statement
没有实际功能。你只需使用逗号运算符执行一些操作并转换结果。 - Anonymous
语法如下:static_cast<TYPE>(EXPRESSION)表达式允许逗号。请注意,它们不是参数;它们是表达式中的运算符。在静态转换中这样做并没有太多意义,只是在语法上是合法的。 - Todd Gamblin
那是一个邪恶的循环。智慧在于知道你可以做什么,而智慧则在于足够了解不要去做。恭喜你拥有两者! - Mr.Ree
除了for循环示例外,逗号运算符在记录日志方面也非常有用。例如:static_cast<int>(log("转换为整数..."), 7); - Ben Collins
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接