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++中,<>代码>类型(值)< /> >和
#包括
使用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
}