据我所知(以及本主题:When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?),const_cast
是唯一应该能够删除变量常量的常量。但是,在搞混clang-6.0
和g++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
有什么作用?
答案 0 :(得分:5)
为Base
添加一个复制构造函数定义,它将回答您的问题。
Base(Base const&) {
std::cout << "Base::Base(Base const&)\n";
}
第二个示例的输出更改为
BEGIN
Base::Base()
Base::Base(Base const&)
Base::no_const()
END
尝试从b
本身中消除常量性,您会看到一个错误
static_cast<Base&>(b).no_const();
// ^
错误:从类型“
static_cast
”到类型“const Base
”的无效Base&
static_cast<Base&>(b).no_const();