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)

  • 嗯,没有区别.+1 (7认同)
  • @Troubadour,我现在明白你的意思了.但我所说的是它适用于所有类型,而不仅仅是像你所说的"内置".关键是`char*`和`identity <char*> :: type`(对于像`boost :: mpl :: identity`这样的模板)和'type`当`type`被typedefed到`char*`all时表示相同的类型.这个问题的措辞是"类型"应该表示一种类型(显然).`type`语法是一个简单类型说明符,但`char*`不是.它是一个`type-id`,你可以将它作为模板参数传递.另外,请不要侮辱人们说他们写"胡说八道". (7认同)
  • @Troubadour,问题是关于`type`,而不是关于`type*`.它仍适用于所有类型,因为制作合适的typedef会使`type`表示`char*`. (3认同)
  • 因此,说"某些类型(类型)版本根本不会编译[但其他版本将会]",这是错误的,因为它肯定会编译为`char*`表示的类型 - 如果你输入它或者你把它写成`identity <char*> :: type(value)` (3认同)
  • 好吧,也许吧:)但是无法解释指针类型呢? (2认同)
  • 所以没有人想回答我关于类型是char*的问题.在第二种情况下它是语法错误的事实是可以的吗?哦,我猜char*不属于所有类型.你每天都在这里学到新东西.;) (2认同)
  • @litb:什么是废话.char*是一个非常好的类型.它可以在模板<class T>中用作T. 我知道你可以使用typedef来规避它,但是如果你读过我之前的评论,你就会知道. (2认同)
  • 为了给出一个更好的例子:我告诉你'a*b`等于'b*a`并且你说"不,对于a = 1和b = 2,这不是真的,因为:`0 + 1*2`是2,而'2*0 + 1`是1." (2认同)

小智 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_varunsigned类型的变量,并且根本不是强制转换.(如果您熟悉指向函数或数组的指针,请考虑如何p在类型void (*pf)()或类型中使用parens int (*pa)[42].)

(警告是因为这些语句不使用该值,并且在真正的程序中几乎肯定是一个错误,但一切仍然有效.我只是在让所有内容排成一行之后没有心去改变它.)

  • @squelart:一开始不是,但是一旦它接近我的工作,并且没有心脏改变它以摆脱警告. (2认同)

dog*_*wgm 7

两者都是强制转换时没有区别,但有时'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中提到的含糊不清一样,该决议是考虑任何可能是声明声明的结构.