创建临时长双变量

时间:2015-12-05 14:45:10

标签: c++

请考虑以下代码:

double d1 {123.123};
double d2 = 123.123;
double {123.123};

long double ld1 {123.123};
long double ld2 = 123.123;
long double {123.123}; // (X)

template <typename T>
void boo (T v) {}

boo<long double> (123.3123);
boo (long double {123.3123}); // (Y)

在示例(X)和(Y)中,GCC 5.2.1产生

error: expected primary-expression before ‘long’

有人可以解释一下,为什么会出现这个错误?

1 个答案:

答案 0 :(得分:2)

首先,在C ++中,您必须为变量命名:

long double dont_have_name {123.123}; // (X)
            ^^^^^^^^^^^^^^

其次,在C ++中你不能这样做:

boo<long double>(long double {123.3123}); // (Y)

不是有效的语法。你可以这样:

boo<long double>(123.3123);

由于显式模板参数,浮点文字123.3123将转换为long double

或者您可以利用模板函数的模板参数推导,并通过long double将输入参数显式地转换为static_cast

boo(static_cast<long double>(123.3123));

或者您可以通过long doubleL对其进行后缀来专门将输入参数标记为l文字:

boo(123.3123L);
boo(123.3123l);

[注意:如果您只将123.3123作为输入参数,那么由于模板参数扣除规则T将被扣除为double,因为浮点文字默认为double类型。]