假设我有以下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
。
答案 0 :(得分:1)
在执行type(value)
时,C ++语法不允许类型名称中包含空格。
相反,您可以使用适当的后缀而不是尝试使用type(value)
。对于long double
,您可以使用l
/ L
return pow( 4.0L, 3.0L );
答案 1 :(得分:0)
首先,原始代码是不正确的,它是一个MSVC错误,无法接受它,see this question为标准引用。
由于powl
是签名的不可重载功能,因此:
long double powl(long double x, long double y);
您可以只写powl(4, 3)
,从整数到长整数都有隐含的覆盖范围。
在更一般的情况下,您的选项包括(long double)4
,static_cast<long double>(4)
,4.L
和4.0L
。 L
后缀加上文字中.
的存在意味着long double
文字。
这很脏:我正在构造一个对象,而不是强制转换int,即使编译器会忽略它。
也许您在这方面有误解。代码double(4)
是强制类型转换;它的正式名称是显式类型转换(功能符号)。强制转换是prvalue,但某些情况与此处无关。
导致类型double
和值4
的prvalue的不同语法在语义上没有任何区别(哈哈)。
对于类类型也是如此; (std::string)x
,std::string(x)
和static_cast<std::string>(x)
的语义完全相同。