3 回答
TA贡献1802条经验 获得超5个赞
没有区别; 根据标准(第5.2.3节):
一个简单类型说明符(7.1.5)后跟一个带括号的表达式列表,可在给定表达式列表的情况下构造指定类型的值。如果表达式列表是单个表达式,则类型转换表达式(在定义上以及含义上)与相应的强制转换表达式(5.4)等效。
由于问题指定了type(value)和之间的差异(type)value,因此绝对没有差异。
当且仅当您要处理用逗号分隔的值列表时,才可以有所不同。在这种情况下:
如果表达式列表指定了多个值,则该类型应为带有适当声明的构造函数的类(8.5、12.1),并且表达式T(x1,x2,...)等效于声明T t (x1,x2,...); 对于某些发明的临时变量t,结果是t的值作为右值。
正如Troubadour指出的那样,存在某些类型的名称,而该类型type(value)根本不会为其编译。例如:
char *a = (char *)string;
将编译,但是:
char *a = char *(string);
将不会。但是,具有不同名称的相同类型(例如,使用创建的typedef)可以起作用:
typedef char *char_ptr;
char *a = char_ptr(string);
TA贡献1898条经验 获得超8个赞
两者都是强制类型转换时没有什么区别,但是有时'type(value)'不是强制类型转换。
以下是标准草案N3242第8.2.1节中的示例:
struct S
{
S(int);
};
void foo(double a)
{
S w( int(a) ); // function declaration
S y( (int)a ); // object declaration
}
在这种情况下,“ int(a)”不是强制转换,因为“ a”不是值,它是一个参数名称,并用多余的括号括起来。文件说明
在6.8的声明中,也可能发生由函数样式转换和6.8中提到的声明之间的相似性引起的歧义。在这种情况下,选择是在带有围绕参数名称的一对多余括号的函数声明和以函数样式作为初始值设定项的对象声明之间进行选择。就像6.8中提到的歧义一样,解决方案是考虑可能是声明的任何构造。
- 3 回答
- 0 关注
- 1139 浏览
添加回答
举报