构造“ long double”右值

时间:2018-08-27 21:30:46

标签: c++ syntax casting rvalue long-double

假设我有以下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

2 个答案:

答案 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)4static_cast<long double>(4)4.L4.0LL后缀加上文字中.的存在意味着long double文字。


  

这很脏:我正在构造一个对象,而不是强制转换int,即使编译器会忽略它。

也许您在这方面有误解。代码double(4)是强制类型转换;它的正式名称是显式类型转换(功能符号)。强制转换是prvalue,但某些情况与此处无关。

导致类型double和值4的prvalue的不同语法在语义上没有任何区别(哈哈)。

对于类类型也是如此; (std::string)xstd::string(x)static_cast<std::string>(x)的语义完全相同。