【发布时间】:2018-08-27 21:30:45
【问题描述】:
假设我有以下 C++ 代码:
#include <cmath>
long double fn_d() {
return pow( double(4), double(3) );
}
long double fn_ld() {
return powl( long double(4), long double(3) );
}
MSVC 对此很满意,但 GCC 和 Clang 都对第二个函数感到困惑,写作(GCC 的输出):
<source>:6:34: error: expected primary-expression before 'long'
6 | return powl( long double(4), long double(3) );
| ^~~~
请注意,上面的 fn_d(...) 可以正常工作。 假设这不是两个编译器中的错误,我应该怎么做?
注意:(long double)(4)(即演员表)不行。它会跳闸-Wold-style-cast(您应该使用它)。也许static_cast<long double>(4)?这感觉很脏:我正在构造一个对象,而不是强制转换 int,即使编译器会忽略它。
【问题讨论】:
-
4L或static_cast<long double>(4) -
using long_double = long double;并更改fn_ld签名以使用 typedef 将解决此问题。 -
注意,
double(4)是一个显式类型转换,就像static_cast<long double>(4),所以它们在语义上是等价的。所以“我正在构造一个对象,而不是一个 int”并不是 100% 正确的。 -
@RichardCritten
4L是长整数,你在想4.L -
我的解决方案就是使用
L后缀。实际的问题被证明是更普遍的,所以我投票结束我自己的问题作为重复。
标签: c++ syntax casting rvalue long-double