一个对象能知道它自己的常量吗?

2023-11-23

With decltype and std::is_const变量的常量可以从外部检测到。但是一个对象是否也有可能知道它自己的常量呢?用法应该是这样的:

#include <type_traits>
#include <iostream>
#include <ios>

struct Test
{
    Test() {}

    bool print() const
    {
       // does not work as is explained in https://stackoverflow.com/q/9890218/819272
       return std::is_const<decltype(*this)>::value; // <--- what will work??
    }
};

int main()
{
    Test t;
    const Test s;

    // external constness test
    std::cout << std::boolalpha << std::is_const<decltype(t)>::value << "\n";
    std::cout << std::boolalpha << std::is_const<decltype(s)>::value << "\n";

    // internal constness test
    std::cout << std::boolalpha << t.print() << "\n";
    std::cout << std::boolalpha << s.print() << "\n"; // <--- false??
}

输出开启生活工作空间这有可能吗?

动机:我希望能够检测 const 成员函数是在 const 对象上调用还是来自非 const 对象。该物体可以例如代表一个缓存,成员代表一个视图。如果缓存是常量的,则可以使用优化的绘制例程,而如果基础数据是非常量的,则绘制例程将需要定期检查数据是否已刷新。

NOTE: 相关的question询问如何打破 const 对象的构建,但我不太明白这个答案是否意味着我的问题肯定是“否”。如果没有,我想捕获布尔值中的常量以供进一步使用。

EDIT:正如 @DanielFrey 所指出的,构造函数不是测试常量性的好地方。那么 const 成员函数呢?


UPDATE:感谢大家纠正我最初提出的不适问题并提供答案的各个部分(构造函数定义不明确的常量、右值this,上下文含义const,事后看来,我忽略了明显的重载技巧,以及潜伏在阴影中的 const 引用别名漏洞)。对我来说,这个问题是 Stackoverflow 最好的回答。我决定选择 @JonathanWakely 的答案,因为它展示了如何定义Mutable and Immutable强化常量概念的课程,以万无一失的方式实现我想要的目标。


对于构造函数(原始问题)来说这是不可能的,因为

12.1 构造函数[class.ctor]

4 A constructor shall not be virtual (10.3) or static (9.4). A constructor can be invoked for a const, volatile or const volatile object. A constructor shall not be declared const, volatile, or const volatile (9.3.2). const and volatile semantics (7.1.6.1) are not applied on an object under construction. They come into effect when the constructor for the most derived object (1.8) ends. A constructor shall not be declared with a ref-qualifier.

对于成员函数(当前问题),您可以简单地提供const和一个非const重载,将两者转发到将常量作为布尔模板参数的(私有)方法。

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

一个对象能知道它自己的常量吗? 的相关文章

随机推荐

  • 以下冒号 (:) 在 MATLAB 语法中意味着什么?

    a imread autumn tif a double a row col dim size a red a 1 green a 2 blue a 3 冒号有什么作用 最后三行是什么意思 上面的片段来自 Dhananjay Thecked
  • 如何在 Junit3 中获得 @BeforeClass 和 @AfterClass 等效项?

    我想在用测试装置替换应用程序的数据库之前备份它 由于 Android 限制 我被迫使用 Junit3 并且我想实现 BeforeClass 和 AfterClass 的等效行为 更新 现在有一个工具 Junit4Android 以获得支持
  • 使用 IText 创建 Pdf 文档#

    如何创建带有表格的 pdf 文档 如下所示 添加命名空间 using iTextSharp text using iTextSharp text pdf 使用c 的代码 Document doc new Document PageSize
  • SimpleAdapter、微调器中的文本和图像

    我有一个小问题 好吧 让我首先说明我想要实现的目标 我有一个旋转器 可以从存储的数组中提取字符串 就像这样 你不需要阅读它 ArrayAdapter
  • Android 中类似 iPhone 的标签栏?

    在 iPhone 中 我们可以创建一个具有选项卡栏的视图 并将其作为应用程序的根视图 然后使用选项卡栏在子视图中导航 Android 中与此最接近的方法是什么 是使用选项卡式控件吗 但这包括仅使用一项活动 在 Android 中使用什么方法
  • 混合声明和代码

    当我使用 gcc o dene Wall ansi pedantic errors dene c 编译函数时 gcc 不会发出错误 你能在 if 循环中查看以 char 开头的行吗 static void remove negation c
  • select() 最大套接字数

    只是更多异步的东西 好吧 现在我的主聊天应用程序有了一个可以工作的异步套接字程序 而且它运行得非常好 不过我有一个担心 使用 select 时 每组中可以使用的文件描述符的最大数量是多少 我读过关于 1024 的限制 如果该限制确实是硬编码
  • 如何将多个谓词应用于 java.util.Stream?

    如何将多个谓词应用于java util Stream s filter method 这就是我现在所做的 但我不太喜欢它 我有一个Collection的事物 并且我需要根据以下内容减少事物的数量Collection过滤器 谓词 的数量 Co
  • AngularJS 使用 FormData API 上传多个文件

    我需要使用 Laravel 5 1 作为后端 在 Angular 应用程序中将图像和视频文件上传到服务器 所有 Ajax 请求都需要首先发送到 Laravel 控制器 我们在那里有代码 说明文件到达那里后如何处理 我们之前已经完成了普通的
  • 将 PyTorch 与 Celery 结合使用

    我正在尝试在 Django 应用程序中运行 PyTorch 模型 由于不建议在视图中执行模型 或任何长时间运行的任务 我决定在 Celery 任务中运行它 我的模型相当大 加载大约需要 12 秒 推理大约需要 3 秒 这就是为什么我决定不能
  • 项目错误:QT 中的未知模块:websockets

    我正在尝试使用 Qt Creator 使用 QTWebsockets 运行一个简单的客户端示例 已经添加了 QT websockets 但是当我运行 build 或 qmake 时它会抛出这个问题 1 error Unknown modul
  • 列出并爆炸

    我正在尝试在我的网站上使用 url 重写 并且我想使用list and explode 函数来获取正确的内容 目前我的代码如下所示 list dir act explode url 在这种情况下 url等于绝对 url 中第一个斜杠之后的所
  • 在 Hibernate 4.3 中关闭 SessionFactory

    我正在将 Hibernate 升级到最新版本 与我的旧HibernateUtil java我没有遇到任何问题 但升级时 SessionFactory 似乎不再关闭 这是我的new HibernateUtil java class impor
  • Git:分支应该隔离更改,还是不应该?

    我以为我已经很好地掌握了 Git 但现在我感到惊讶 我认为分支会将更改与其他分支隔离 因此我在新分支中开始了大规模的实验性重构 这种重构意味着移动许多文件 当我切换到 master 时 我仍然可以看到变化 我转到我的沙箱存储库来复制问题 g
  • Python正则表达式在字符串中查找双引号中的字符串

    我正在使用正则表达式在 python 中寻找可以执行类似操作的代码 Input Regex should return String 1 or String 2 or String3 Output String 1 String2 Stri
  • 如何使用MediaSessionCompat并保持与RemoteControlClient的向后兼容性?

    我想使用 MediaSession 将我的应用程序中的 Android RemoteControlClient 类替换为新的类 但不适用于 API 级别 有什么片段或信息给我吗 谢谢大家 从 Support v4 库的修订版 22 开始 M
  • Laravel 非重叠计划作业未执行

    我有一个 Laravel Scheduled 作业 其定义为Kernel php like so schedule gt call App Http Controllers ScheduleController processQueuedM
  • 在opengl中将颜色应用于四边形中的单个顶点

    我正在尝试为绘制的四边形的单个顶点着色glDrawElements 我正在与cocos2d库 因此我能够清理源代码以准确了解发生了什么 代码如下 glBindVertexArray VAOname glDrawElements GL TRI
  • 用于 JSON 文件的 Hadoop

    对于处理包含 JSON 条目和 Hadoop 的文件的最佳方法 您是否有任何提示 Hadoop in Practice 一书中有一篇关于此的好文章 http java dzone com articles hadoop practice
  • 一个对象能知道它自己的常量吗?

    With decltype and std is const变量的常量可以从外部检测到 但是一个对象是否也有可能知道它自己的常量呢 用法应该是这样的 include