const_cast 的行为

2024-01-12

我正在阅读有关 C++ 中的 const_cast 运算符的内容

1.我无法理解的第一件奇怪的事情是

const_cast 运算符语法,即

-const_cast----(--表达式--)-------------------->

我对这种语法的理解是,它有助于摆脱常量性expressionof type Type.但是考虑一下这段代码

class  ConstTest {   

private:
    int year;
public:
    ConstTest() : year(2007) {}
    void  printYear() const;
};

int main() {
    ConstTest c;
    c.printYear();
    return  0;
}

void ConstTest::printYear() const {
    ConstTest  *c  = const_cast<ConstTest*>(this);
    c->year  = 42;
    std::cout  <<  "This  is the  year "  << year  << std::endl;
}

这里排队ConstTest *c = const_cast<ConstTest*>(this),我认为 constthis指针应该被丢弃,但输出显示它是该对象this指失去其恒定性。

我觉得代码应该是ConstTest *c = const_cast<ConstTest>(*this),但这会产生错误。我知道我的很多解释都是错误的。请大家指正。

2.我的第二个问题是下面给出的陈述

除非 Type 是引用类型,否则 const_cast 表达式的结果是右值。在这种情况下,结果是左值。

为什么会这样,为什么在指针的情况下却不是这样?


它有助于消除 Type 类型表达式的常量性

No, Type是结果的类型,而不是操作数的类型。

我认为这个指针的 const 应该被抛弃

this有类型const ConstTest*. const_cast<ConstTest*>(this)有类型ConstTest*。这就是从指向 const 的指针中“抛弃 const”的含义。

我觉得代码应该是ConstTest *c = const_cast<ConstTest>(*this)

的结果const_cast<T>具有类型 T,这就是它的定义方式。也许你会对它有不同的定义,但运气不好,你没有得到ConstTest*通过写作const_cast<ConstTest>,你可以通过写得到它const_cast<ConstTest*>。您的首选语法不可用。

你可以做ConstTest &c = const_cast<ConstTest&>(*this) or ConstTest *c = const_cast<ConstTest*>(this),所以选择你最喜欢的。

const_cast 表达式的结果是右值,除非 Type 是 参考类型。在这种情况下,结果是左值。

为什么会这样,为什么在指针的情况下不正确?

对于指针来说也是如此。ConstTest*不是引用类型,并且结果const_cast<ConstTest*>(this)是一个右值。然后将该值分配给变量c.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

const_cast 的行为 的相关文章

随机推荐

  • 有人找到了适用于 Visual Studio 的 PowerShell 语法突出显示或 IntelliSense 插件吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Angular SSR 在生产环境中“无法查找视图”(Ubuntu、Nginx)

    遵循有关使用 Express 服务器设置 SSR 的官方 Angular 教程 https angular io guide universal configure for universal https angular io guide
  • 状态机适合解决什么样的问题? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何调用 setCountry() 来 AutocompleteFilter Google place API?

    我正在实现 PlaceAutocompleteFragment 来自动完成位置 我想将搜索限制在特定国家 地区 就像之前我们在网址中使用 component UK 一样 我怎样才能在下面的代码中实现这一点 Override protecte
  • 删除数据库时出错(无法 rmdir '.test\',errno:17)

    基本上 我学习了如何使用 mysqladmin u root p password 命令创建 root 密码 这都是通过 Windows 命令编辑器完成的 现在 下一个过程是显示默认数据库 info schema mysql 和 test
  • C++ 领域特定嵌入式语言运算符

    在面向数值的语言 Matlab Fortran 中 范围运算符和语义在处理多维数据时非常方便 例如 A i j k n represents two dimensional slice B i j 0 n of A at index k 不
  • Ruby:从大文件中的任意点开始读取

    我有一些日志文件想要筛选 内容正是您在日志文件中所期望的 许多单行逗号分隔的文本 每个文件大约有 4 GB File each line 或 foreach 其中之一大约需要 20 分钟 由于简单的 foreach 看起来 简单 而且慢 我
  • 两个日期之间不同年份的列表

    我想检索两个日期之间不同年份的列表 例如 从25 12 2006 to 14 11 2013 结果应如下所示 2006 2007 2008 2009 2010 2011 2012 2013 这在 SQL Server 中可能吗 像这样的约会
  • 如何登录 Fabrics 发送长消息

    我正在尝试在 Fabrics 系统 Android 上编写长文本日志消息 如下所示 Answers getInstance logCustom new CustomEvent Request requestUrl nResponse jso
  • iPhone开发

    我对 iPhone 开发非常感兴趣 以及如何开始 iPhone 开发 我对 C 没有基本的了解 但我有编程知识和概念 iPhone 开发中心 http developer apple com iphone index action是你的起点
  • 如何使用基于类的addEventListener检索当前元素?

    我正在使用一个函数来检索接收事件的当前元素 在本例中为单击 但我想从 HTML 脚本中删除该函数并使用event listener做同样的事情 但是我正在使用一个类来瞄准元素 如果我只有一个元素 那就很容易了 但事实并非如此 我的第一个想法
  • 在 MVC4 中显示错误,我必须实现一些接口,但我已经完成了

    我正在尝试创建自己的过滤器属性以支持多语言 这个想法很简单 URL 代表语言 http host ext en rest of the url 将以英语打开 并且 http host ext hy rest of the url 将以亚美尼
  • PhpStorm 中的差异

    如何将当前项目中的文档与不属于该项目的文档进行比较 如何使用 phpStorm 比较计算机上的两个任意文件 目前 我发现比较项目文件与非项目文件的最简单方法是将外部文件复制到剪贴板 然后单击 查看 gt 与剪贴板比较
  • PHP 将两个时间变量相加

    在我的 PHP 应用程序中 我想计算两个时间变量的总和 我正在寻找类似这个例子的东西 time1 15 20 00 time2 00 30 00 time time1 time2 如果你期望的答案是15 50 00你想使用strtotime
  • 执行 git reset --hard HEAD^ 后恢复添加/暂存的文件?

    我添加了一个新文件F1并对另一个文件 F2 进行了更改 但随后做了git reset hard HEAD 并且我丢失了对文件的所有更改 有没有some怎么样 我可以把它们找回来吗 我确实在这里看过一个相关问题 如何撤消 git reset
  • 更改函数中的每个 for 循环,以便在每次失败的迭代后自动执行错误处理

    这个问题源于捕获生成器内的错误并随后继续 https stackoverflow com questions 13645112 catch errors within generator and continue afterwards 我有
  • 使用 4 mb 查找不在 40 亿列表中的整数。但 4 MB 还不够[重复]

    这个问题在这里已经有答案了 给定一个包含 40 亿个整数的列表 找到一个不在列表中的整数 使用 4MB 内存 采访是用Java进行的 我的解决方案是使用 BitSet 然而根据我的计算 4 MB 内存中没有足够的位 c 4 MB 4096
  • 标题文本垂直居中

    我希望增加 jquery 移动应用程序标题的大小 当我这样做时 我需要将标题居中 我发现我可以添加一行 line height 30px 到CSS 但这还远远不够 我想一定有更好的方法来做到这一点
  • getSystemService(Context.NSD_SERVICE) 冻结 5.0 模拟器

    尝试执行以下行 NsdManager Mgr NsdManager Ctxt getSystemService Context NSD SERVICE 在 Android 5 0 模拟器 ARMv7a 在 Win64 上 中 模拟器会冻结
  • const_cast 的行为

    我正在阅读有关 C 中的 const cast 运算符的内容 1 我无法理解的第一件奇怪的事情是 const cast 运算符语法 即 const cast 表达式 gt 我对这种语法的理解是 它有助于摆脱常量性expressionof t