首页 > 解决方案 > 使用 const_cast 的自动类型推导不起作用

问题描述

在我的工作中,使用const_cast在某些情况下是不可避免的。

现在我有const_cast一些非常复杂的类型,实际上我不想在const_cast<Clutter>表达式中写出所有这些类型的混乱,尤其是如果Clutter很长的话。

我的第一个想法是编写const_cast<>(myType),但我的编译器无法推断myType. 因此,我考虑帮助我的编译器,并采用以下方法进行编译。

#include <stdlib.h>
#include <iostream>

int main(int, char**) {
    const int constVar = 6;
    using T = typename std::remove_cv<decltype(constVar)>::type;
    auto& var = const_cast<T&>(constVar);
    var *= 2;
    std::cout << &constVar << " " << &var << "\n"; // Same address!
    std::cout << constVar << " " << var << "\n";
    return EXIT_SUCCESS;
}

不幸的是,程序给了我输出6 12而不是预期的6 6,我真的不明白吗?

我的方法有什么问题?

标签: c++templatesvisual-studio-2015const-cast

解决方案


从以下文档const_cast

const_cast可以形成指向实际引用 const 对象的非 const 类型的引用或指针,或者形成指向实际引用 volatile 对象的非易失类型的引用或指针。通过非 const 访问路径修改 const 对象并通过非易失性左值引用易失性对象会导致未定义的行为。

所以你所拥有的是未定义的行为。

同样令人感兴趣的是来自cv type qualifiers的注释。

const object - 类型为 const 限定的对象,或 const 对象的非可变子对象。这样的对象不能被修改:直接尝试这样做是编译时错误,并且尝试间接这样做(例如,通过引用或指向非 const 类型的指针修改 const 对象)会导致未定义的行为。


推荐阅读