(types)值和types(值)之间有什么区别?

有什么区别

(type)value 

 type(value) 

在C ++?

没有区别; 根据标准(§5.2.3):

一个简单types说明符(7.1.5)后跟一个带括号的expression式列表,根据expression式列表构造一个指定types的值。 如果expression式列表是单个expression式,则types转换expression式与相应的强制转换expression式(5.4)是等价的(在定义中,如果定义的话)。

由于该问题指定了type(value)(type)value之间的差异,因此完全没有区别。

当且仅当您处理逗号分隔的值列表可以有所不同。 在这种情况下:

如果expression式列表指定了多个单个值,那么types应该是一个具有适当声明的构造函数(8.5,12.1)的类,并且expression式T(x1,x2,…)与声明T t (x1,x2,…); 对于一些发明的临时variablest,其结果是t的值作为右值。

正如Troubadour所指出的, type(value)版本有一些types的名称根本不会被编译。 例如:

 char *a = (char *)string; 

会编译,但是:

 char *a = char *(string); 

将不会。 具有不同名称的相同types(例如,使用typedef创build)可以工作:

 typedef char *char_ptr; char *a = char_ptr(string); 

没有区别; 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; } 

注意: unsigned(a_var)是不同的,但是确实显示了这些确切的标记可能意味着其他的东西。 它声明了一个名为types为unsigned的variablesa_var ,根本不是一个类。 (如果您熟悉指向函数或数组的指针,请考虑如何在void (*pf)()int (*pa)[42] )types中使用p周围元素。

(因为这些语句没有使用这个值,而且在一个真正的程序中几乎可以肯定是一个错误,但是一切仍然有效,所以产生了一些警告。在把所有东西排成一行之后,我只是没有改变它的心)。

两者都是铸造时没有区别,但有时'types(价值)'不是铸造。

以下是标准草案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)”不是一个强制types,因为“a”不是一个值,而是一个由冗余括号包围的参数名称。 该文件指出

6.8中提到的函数式转换和声明之间的相似性也可能出现在声明的上下文中。 在这种情况下,select是在一个函数声明和一个带有冗余括号的函数声明之间,一个带有函数风格强制转换的对象声明作为初始化器。 正如6.8中提到的含糊之处一样,决议是考虑任何可能成为声明的结构。

在c中没有type (value) ,而在c / c ++中, type (value)(type) value都是允许的。

为了说明你在C ++中的select(只有一个有安全检查)

 #include<boost/numeric/conversion/cast.hpp> using std::cout; using std::endl; int main(){ float smallf = 100.1; cout << (int)smallf << endl; // outputs 100 // c cast cout << int(smallf) << endl; // outputs 100 // c++ constructor = c cast cout << static_cast<int>(smallf) << endl; // outputs 100 // cout << static_cast<int&>(smallf) << endl; // not allowed cout << reinterpret_cast<int&>(smallf) << endl; // outputs 1120416563 cout << boost::numeric_cast<int>(smallf) << endl; // outputs 100 float bigf = 1.23e12; cout << (int)bigf << endl; // outputs -2147483648 cout << int(bigf) << endl; // outputs -2147483648 cout << static_cast<int>(bigf) << endl; // outputs -2147483648 // cout << static_cast<int&>(bigf) << endl; // not allowed cout << reinterpret_cast<int&>(bigf) << endl; // outputs 1401893083 cout << boost::numeric_cast<int>(bigf) << endl; // throws bad numeric conversion }