C++ C/C和x2B中的结构复制问题+;用VS2008编译
我使用Visual Studio 2008编译了以下C/C++代码:C++ C/C和x2B中的结构复制问题+;用VS2008编译,c++,visual-studio,struct,C++,Visual Studio,Struct,我使用Visual Studio 2008编译了以下C/C++代码: struct TEST_STRUCT{ int nV; float v; TEST_STRUCT() { nV = 0; v = 0.0; } }; TEST_STRUCT v1; v1.nV = 100; v1.v = 2.0; const TEST_STRUCT v2; //Making it 'const' to p
struct TEST_STRUCT{
int nV;
float v;
TEST_STRUCT()
{
nV = 0;
v = 0.0;
}
};
TEST_STRUCT v1;
v1.nV = 100;
v1.v = 2.0;
const TEST_STRUCT v2; //Making it 'const' to prevent any further changes
(TEST_STRUCT)v2 = v1;
int a = v2.nV; //'a' is 0, why???
为什么我会得到这样一个奇怪的结果?你刚刚做了一件非常糟糕的事情:你放弃了常数限定符
const TEST_STRUCT v2 = v1;
或
会给你你想要的。。。除非你决定违反常量限定符,这是非常非常糟糕的。你刚刚做了一件非常糟糕的事情:你放弃了常量限定符
const TEST_STRUCT v2 = v1;
或
会给你你想要的。。。除非您决定违反const限定符,这是非常非常糟糕的。如前所述,您试图分配给的对象是一个临时对象,而原始对象保持不变。这是编译器没有抱怨的原因之一。如果您想投射实际对象,您可以使用以下内容:
const_cast<TEST_STRUCT&>(v2) = v1;
或
在这种情况下,两个调用在语义上是等价的,尽管后一个调用理论上涉及两个副本。如果
v1
具有不同的类型,则两个调用略有不同,后者先转换,然后复制。尽管副本通常被省略,但它仍然需要一个副本构造函数。如前所述,您试图分配给的对象是一个临时对象,而原始对象保持不变。这是编译器没有抱怨的原因之一。如果您想投射实际对象,您可以使用以下内容:
const_cast<TEST_STRUCT&>(v2) = v1;
或
在这种情况下,两个调用在语义上是等价的,尽管后一个调用理论上涉及两个副本。如果
v1
具有不同的类型,则两个调用略有不同,后者先转换,然后复制。尽管副本通常被省略,但它仍然需要一个副本构造函数。您告诉编译器对象是常量,它依赖于此。您告诉编译器对象是常量,它依赖于此。
TEST_STRUCT const v2 = v1;