gpt4 book ai didi

c++ - static_cast 带走了常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:48 24 4
gpt4 key购买 nike

据我所知(以及本主题: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

什么给了?

最佳答案

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 本身中摆脱 constness,你会看到一个错误

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

error: invalid static_cast from type 'const Base' to type 'Base&'

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

关于c++ - static_cast 带走了常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52021345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com