当我们从类返回可变对象时const_cast的未定义行为

时间:2016-03-16 17:21:41

标签: 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;
    }
};

int main()
{
    A a;
    vector<int> &b = const_cast<vector<int>&>( a.get() );
    b[0] = 3;
    cout << a.a[0] << endl;
}

2 个答案:

答案 0 :(得分:3)

很好地定义了修改非const的变量。 const_cast正好存在,允许使用const引用修改非const对象(尽管名称也适用于volatile)。示例代码中没有未定义的行为。

答案 1 :(得分:1)

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

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