C++ C/C和x2B中的结构复制问题+;用VS2008编译

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

我使用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 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;