static_cast带走了constness

时间:2018-08-25 21:24:55

标签: c++

据我所知(以及本主题:When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?),const_cast是唯一应该能够删除变量常量的常量。但是,在搞混clang-6.0g++5.4.0时,我偶然发现了与上述矛盾的行为。看来static_cast做的工作完全相同。

这些主要功能在两个编译器中给出的结果完全相同:

测试类定义

struct Base {
        Base() {
                std::cout << "Base::Base()\n";
        }
        void test() const {
                std::cout << "Base::test()\n";
        }

        void no_const() {
                std::cout << "Base::no_const()\n";
        }

        virtual ~Base() = default;
};

const_cast

int main(void) {
        std::cout << "BEGIN\n";
        const Base b;
        const_cast<Base&>(b).no_const();

        std::cout << "END\n";
}

static_cast

int main(void) {
        std::cout << "BEGIN\n";
        const Base b;
        static_cast<Base>(b).no_const();

        std::cout << "END\n";
}

结果:

BEGIN
Base::Base()
Base::no_const()
END

有什么作用?

1 个答案:

答案 0 :(得分:5)

Base添加一个复制构造函数定义,它将回答您的问题。

Base(Base const&) {
        std::cout << "Base::Base(Base const&)\n";
}

第二个示例的输出更改为

BEGIN
Base::Base()
Base::Base(Base const&)
Base::no_const()
END

Live demo


尝试从b本身中消除常量性,您会看到一个错误

static_cast<Base&>(b).no_const();
//              ^
  

错误:从类型“ static_cast”到类型“ const Base”的无效Base&

  static_cast<Base&>(b).no_const();