C++ (类型)值和(类型)值之间有什么区别?

C++ (类型)值和(类型)值之间有什么区别?,c++,type-conversion,casting,C++,Type Conversion,Casting,两者的区别是什么 (type)value 及 < C++ > 无差异;根据标准(§5.2.3): 一个简单的类型说明符(7.1.5)后跟一个带括号的表达式列表,在给定表达式列表的情况下构造一个指定类型的值。如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(定义和定义)。 由于问题指定了类型(值)和类型(值)之间的区别,因此绝对没有区别 当且仅当您处理的是逗号分隔的值列表时,才会有差异。在这种情况下: 如果表达式列表指定了不止一个值,则类型应为具有适当声明的构造

两者的区别是什么

(type)value


< C++ >

无差异;根据标准(§5.2.3):

一个简单的类型说明符(7.1.5)后跟一个带括号的表达式列表,在给定表达式列表的情况下构造一个指定类型的值。如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(定义和定义)。 由于问题指定了
类型(值)
类型(值)
之间的区别,因此绝对没有区别

当且仅当您处理的是逗号分隔的值列表时,才会有差异。在这种情况下:

如果表达式列表指定了不止一个值,则类型应为具有适当声明的构造函数(8.5,12.1)的类,并且表达式T(x1,x2,…)实际上等同于声明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);

没有区别;C++标准(1998版和2003版)对此很清楚。请尝试以下程序,确保使用兼容的编译器,例如免费预览

#包括
#包括
int main(){
int('A');(int)'A';//显而易见
(std::string)“abc”;//不太明显
无符号(a_var)=3;//参见下面的注释
(long const&)a_var;//const或refs,这是T(v)不能做的
返回退出成功;
}
注意:
unsigned(a_var)
是不同的,但它确实显示了这些确切的标记可能意味着其他东西的一种方式。它声明了一个名为unsigned类型的变量
a_var
,根本不是强制转换。(如果您熟悉函数或数组的指针,请考虑在代码< >代码>空隙(*pf)()/<代码>或<代码> int(*PA)[42 ] < /C> >中,如何使用一个围绕“代码> P<代码>的PARS”。
(由于这些语句不使用该值,因此会产生警告,在实际程序中,这几乎肯定是一个错误,但一切仍然有效。我只是不忍心在将所有内容排列好后更改它。)

两种类型都是强制转换时没有区别,但有时“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”不是值,它是一个由冗余括号包围的参数名。该文件指出

由于函数样式之间的相似性而产生的歧义 cast和6.8中提到的声明也可以在上下文中出现 声明的内容。在这种情况下,需要在函数之间进行选择 在参数周围有一组冗余括号的声明 名称和对象声明,并将函数样式转换为 初始化器。正如6.8中提到的歧义一样 解决方案是考虑任何可能构成的结构。 声明一项声明


<>在C中没有<代码>类型(值)< /> >,而在C/C++中,<>代码>类型(值)< /> >和(type)值 >。

< P>以说明C++中的选项(只有一个有安全检查)

#包括
使用std::cout;
使用std::endl;
int main(){
浮点数f=100.1;

cout-Um,没有区别。+1所以没有人想回答我关于类型是类似char*的问题。第二种情况下的语法错误可以吗?哦,我想char*并不是所有类型都有。你每天都在这里学到新东西。@Troubadour,问题是关于
类型
,而不是关于
type*
。它仍然适用于所有类型,因为制作一个合适的typedef将使
type
表示
char*
@Troubadour,我现在明白你的意思了。但我说的是它适用于所有类型,而不仅仅是像你说的“内置类型”。重点是
char*
identity::type
(对于像
boost::mpl::identity
)和
type
这样的模板,当
type
被类型定义为
char*
时,它们都表示相同的类型。问题的措辞应该是
type
应该表示一个类型(显然)从语法上讲,
type
是一个简单的类型说明符,但
char*
不是。它是一个
type id
,可以作为模板参数传递。另外,请不要说人们写的是“胡说八道”来侮辱他们。因此,说“某些类型的类型(值)版本根本无法编译”是错误的[但另一个版本将]”,因为它肯定是为
char*
表示的类型编译的-如果您键入def它,或者如果您将它写成
identity::type(value)
@squelart:一开始不是,但一旦它接近了,我就把它处理好了,只是不忍心为了消除警告而改变它。还没有提到的东西:
(type)value;
type(value);
是不同的-后者定义了一个名为
value
的变量。
#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;
}
struct S 
{
    S(int);
};

void foo(double a) 
{
    S w( int(a) ); // function declaration
    S y( (int)a ); // object declaration
}
#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
}