SMA*_*T_n 43 c++ casting type-conversion
有什么区别
(type)value
Run Code Online (Sandbox Code Playgroud)
和
type(value)
Run Code Online (Sandbox Code Playgroud)
在C++中?
Jer*_*fin 50
没有区别; 按照标准(§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;
Run Code Online (Sandbox Code Playgroud)
会编译,但是:
char *a = char *(string);
Run Code Online (Sandbox Code Playgroud)
将不会.具有不同名称的相同类型(例如,使用a创建typedef
)可以工作:
typedef char *char_ptr;
char *a = char_ptr(string);
Run Code Online (Sandbox Code Playgroud)
小智 13
没有区别; 关于这一点,C++标准(1998年和2003年版)很清楚.尝试以下程序,确保使用符合的编译器,例如http://comeaucomputing.com/tryitout/上的免费预览.
#include <cstdlib>
#include <string>
int main() {
int('A'); (int) 'A'; // obvious
(std::string) "abc"; // not so obvious
unsigned(a_var) = 3; // see note below
(long const&) a_var; // const or refs, which T(v) can't do
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
注意:unsigned(a_var)
是不同的,但确实显示了这些精确令牌可能意味着其他东西的一种方式.它声明一个名为a_var
unsigned类型的变量,并且根本不是强制转换.(如果您熟悉指向函数或数组的指针,请考虑如何p
在类型void (*pf)()
或类型中使用parens int (*pa)[42]
.)
(警告是因为这些语句不使用该值,并且在真正的程序中几乎肯定是一个错误,但一切仍然有效.我只是在让所有内容排成一行之后没有心去改变它.)
两者都是强制转换时没有区别,但有时'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
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,'int(a)'不是强制转换,因为'a'不是值,它是由冗余括号包围的参数名称.该文件指出
函数式转换与6.8中提到的声明之间的相似性所产生的模糊性也可以在声明的上下文中出现.在该上下文中,选择在函数声明与参数名称周围的冗余括号集和具有函数样式转换作为初始化器的对象声明之间.正如6.8中提到的含糊不清一样,该决议是考虑任何可能是声明声明的结构.
归档时间: |
|
查看次数: |
2280 次 |
最近记录: |