带有多个参数的 static_cast 是怎么回事?

Posted

技术标签:

【中文标题】带有多个参数的 static_cast 是怎么回事?【英文标题】:What's up with static_cast with multiple arguments? 【发布时间】:2010-10-10 07:08:16 【问题描述】:

谁能告诉我这个演员有什么效果(除了将happyNumber设置为1337),如果有的话,如果没有其他效果,我怎么能写这样的代码???这是编译器错误,还是 C++ 的某些“隐藏功能”?

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

我很惊讶这会编译。我是通过一个错误发现的,在该错误中,我不小心将第二个参数设置为要在被强制转换的表达式的函数调用中使用的东西。这导致了一个令人讨厌的错误,其中对象是从第二个参数强制转换的,只使用一个参数调用函数。它编译了......并且最初并没有繁荣......

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

【问题讨论】:

完全合法,没有错误。 啊,是的,你是对的。当时我很困惑,我知道它一定是一个编译器错误 - 它不是:)我以前从未遇到过逗号运算符。 【参考方案1】:

静态转换接受一个参数,但它的参数是一个表达式,表达式可以包括comma operator。逗号用于您想同时评估两个或多个表达式的副作用的情况,例如:

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

它有点用处,因为没有它,您只能为 for 循环的初始化程序、条件和 continue 部分(或任何其他需要表达式的地方)分别计算一个表达式。但是,它通常不会产生最清晰的代码,而且语义也很奇怪。正如您所观察到的,以逗号分隔的序列的计算结果为其最后一个表达式的值。

【讨论】:

我了解它在语法中的用法,但我无法掌握 static_cast 中的功能。 没有功能。您只需使用逗号运算符执行一些操作并转换结果。 啊,多亏了你和鲁本,我现在明白了它是如何工作的,并且学到了一些新东西:) 语法是:static_cast(EXPRESSION) 表达式恰好允许逗号。请注意,它们不是参数;它们是表达式中的运算符。在静态强制转换中这样做并没有什么意义,它只是在语法上是合法的。 好的。我没有意识到我可以制作这样的 for 循环:for(int i = 0; ++i, i

以上是关于带有多个参数的 static_cast 是怎么回事?的主要内容,如果未能解决你的问题,请参考以下文章

Vuex+Laravel:无法将带有 FormData 和 axios 的多个文件发送到服务器端。在服务器端始终为空。这是怎么回事?

这个非虚函数反编译后怎么回事?

WIN10在运行命令符时提示“找不到接受实际参数“start=”的位置形式参数”是怎么回事?

Clang 不允许 static_cast 到带有模板的父类,而 g++ 和 icc 允许

进游戏提示非法参数是怎么回事

微信小程序参数错误怎么回事