请考虑以下代码:
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’
有人可以解释一下,为什么会出现这个错误?
答案 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 double
或L
对其进行后缀来专门将输入参数标记为l
文字:
boo(123.3123L);
boo(123.3123l);
[注意:如果您只将123.3123
作为输入参数,那么由于模板参数扣除规则T
将被扣除为double
,因为浮点文字默认为double
类型。]