C++ 从类返回可变对象时const_cast的未定义行为

C++ 从类返回可变对象时const_cast的未定义行为,c++,C++,我不确定在这种情况下const_cast的情况。我们是否有未定义的行为 #include <iostream> #include <vector> using namespace std; struct A { mutable vector<int> a; A() : a(1,2) {} const vector<int>& get() const { return a; } }; in

我不确定在这种情况下const_cast的情况。我们是否有未定义的行为

#include <iostream>
#include <vector>

using namespace std;

struct A {
    mutable vector<int> a;
    A() : a(1,2) {}
    const vector<int>& get() const {
        return a;
    }
};

int main()
{
    A a;
    vector<int> &b = const_cast<vector<int>&>( a.get() );
    b[0] = 3;
    cout << a.a[0] << endl;
}
#包括
#包括
使用名称空间std;
结构A{
可变向量a;
A():A(1,2){}
常量向量&get()常量{
返回a;
}
};
int main()
{
A A;
向量&b=const_cast(a.get());
b[0]=3;

cout修改一个非常量变量定义良好。
const\u cast
的存在正好允许使用常量引用修改非常量对象(尽管名称不同,对volatile也适用)。示例代码中没有未定义的行为。

从对非常量变量的引用中删除常量是安全的。在这种情况下,
a
是非常量,
a.a
是非常量,因此
常量转换
是完全合法的

const_cast
也是一个坏主意,因为它可能会导致在背后违反类的不变量。对向量的修改应该通过类的适当公共接口来完成。

dupe/related:的最后一部分有助于理解const casting以及您可以和不能做什么。