为什么const_cast的行为与预期不符?

7
struct A
{
    A() {}

private:
    A(const A&); // Explicitly disable the copy constructor.
};

int main()
{
    const A a1; // OK.
    A       a2; // OK.
    auto    a3 = const_cast<A&>(a1); // Compiler error C2248! ???       
}

我的C++编译器是最新的VC++ 2013预览版。

编译器在最后一行抱怨错误C2248:“A::A”:无法访问在类“A”中声明的私有成员

为什么const_cast不能按预期工作?

1个回答

13

auto本身不是引用类型。因此,最后一行等价于

A a3 = const_cast<A&>(a1);
尝试使用私有构造函数复制 a1
如果您需要引用,请指定一个引用:
auto & a3 = const_cast<A&>(a1);
当然,尝试使用此引用来修改 a1 将会导致未定义的行为,因为该对象本身是 const

这是否意味着 const_cast 会生成新的对象? - lulyon
5
不;const_cast<A&> 的结果是对已存在对象的引用。声明一个对象会生成一个新对象,而auto a = whatever;也会这样做(无论whatever是否是引用)。 - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接