C++11 的 &&(R 值引用)运算符是否废弃了“代理对象”设计模式?

2024-05-01

Scott Meyers 的第 30 项“更有效的 C++” http://www.amazon.co.uk/More-Effective-Programs-Professional-Computing/dp/020163371X绘制出“代理对象”编程设计模式。

问题是如果你有:

X x;
x[3]=42; 
cout<<x[3]

...你需要X的operator[]重载才能区分L值和R值的使用。

(也许您需要运行不同的代码,例如,在第一种情况下可能涉及大量复制,但在第二种情况下也许我们可以只传回引用)。

代理模式是X包含一个Proxy类,X的operator[]重载返回一个Proxy类型的对象。

这样代码就变成了:

X x;
{some Proxy object}=42; 
cout<<{some Proxy object}

现在我们只需为我们的 Proxy 对象提供一个“operator=”的重写,它处理第一种情况,以及“转换为 std::string 或 char*”的重写,它处理第二种情况。

并且C++尝试找到合适的类型转换将触发相关的覆盖。

然而,本书是在 C++11 之前编写的,C++11 的主要特性之一是新的 &&(R 值引用)运算符。

现在是否有一种更简单的方法来编码单独的 R 值和 L 值分配?

这种代理对象设计模式现在已经过时了吗?


不,我不相信这里还有替代机制。

虽然 ref 限定方法可以在某些情况下提供不同的行为,但重载是根据调用它们的对象的状态来解析的。它们没有解决它们返回的对象的使用问题。

在下面的活生生的例子 http://coliru.stacked-crooked.com/a/3e2ae971d7b15c65,我围绕 a 创建一个包装器std::vector,在分配到索引时尝试自动增长向量,并在仅从索引读取时允许未定义的行为。

但它不是这样工作的:

template <typename T>
struct AutoVector
{
    std::vector<T> m_vec;
    AutoVector() { m_vec.resize(1); }

    T& operator[](const size_t index) &
    {
        std::cout << "Inside operator[" << index << "]&\n";
        if (m_vec.size() < index)
            m_vec.resize(index);
        return m_vec[index];
    }

    T operator[](const size_t index) &&
    {
        std::cout << "Inside operator[" << index << "]&&\n";
        return m_vec[index];
    }
};

如果通过以下方式调用,两者都会调用左值限定operator[] &:

AutoVector<int> avec;
avec[4] = 6;
std::cout << avec[4] << "\n";
    --> Inside operator[4]&
    --> Inside operator[4]&
    --> 6

如果在临时对象上调用它,它可以调用右值限定的operator[] &&:

std::cout << AutoVector<int>()[0] << "\n";
    --> Inside operator[0]&&
    --> 0

这不具有所需的行为。对返回的代理对象应用相同类型的测试operator[]通常会导致它在所有情况下调用右值限定的方法,除非代理被捕获并命名。它仍然无法反映代理的使用方式。

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

C++11 的 &&(R 值引用)运算符是否废弃了“代理对象”设计模式? 的相关文章

随机推荐

  • Android-数据在微调器中分配,但选择时不显示微调器中的值

    Problem我正在使用 Retrofit 从 mysql 获取一些产品类别 数据即将到来并在微调器中分配 但是当我选择一个项目时 它不会显示 在下拉菜单中 项目已分配 并且 setOnItemSelected 侦听器也正在工作 但所选项目
  • 在 Emacs 中自动完成 Bibtex 文件中的 Pandoc 风格引文

    Pandoc 风格的引文 Pandoc http www johnmacfarlane net pandoc 使用 Markdown 格式 支持使用 BibTeX 文件中的键自动引用 该格式的一些示例如下 Blah blah doe99 B
  • 客户端和服务器的 Git 分支结构

    对于我的一门计算机科学课程 我和一个小组正在使用客户端 服务器架构编写一个应用程序 我很好奇在 Git 存储库中组织项目的最佳实践是什么 我的意思是 我们是否应该像这样构建目录 ProjectDir Clients Client1 file
  • 如何强制netbeans html自动完成使用双引号而不是单引号?

    我正在使用 NetBeans 7 3 我喜欢它的自动完成功能 然而在这个新的 7 3 版本中 当我输入
  • 熊猫系列名称

    我试图将我的系列命名为 Points 但它没有显示为 Points Points pd Series 1 2 3 print Points name output None 我什至尝试重命名它 但它仍然显示 无 Points rename
  • 增加图像亮度而不溢出

    我在尝试增加图像亮度时遇到问题 这是原始图像 我想要得到的图像是这样的 现在使用以下代码增加亮度 image cv2 imread home wni vbshare tmp a4 index2 png 0 if sum image 0 le
  • 在 Android 中打开受密码保护的 ZIP?

    有没有一个库或一个简单的方法如何在 Android 中打开受密码保护的 ZIP 存档 我知道 ZIP 加密有不同类型 我想打开最简单的一个 在 Unix 中使用以下命令创建zip e命令 可以在 Windows 中打开相同的文件 将要求输入
  • 复杂的 SOLR 查询,包括 NOT 和 OR

    我对 SOLR 搜索有一些相当复杂的要求 我需要针对标记内容的数据库执行这些搜索 我需要首先过滤数据库以获取与我的过滤器标签匹配的结果 任何具有黑名单中的标签的结果都应被删除 除非它们也包含白名单中的标签 假设我想检索所有标记为 森林 或
  • 使用 JavaScript 或 PHP 自动检测用户当前本地时间

    我经常需要根据用户的信息或受用户的影响来显示信息actual本地时间因时区而异 是否有可靠的方法来获取用户的当前时间和 或时区 关键的问题 服务器端代码基于网站主机或用户的ISP 客户端代码基于用户的系统时钟 太容易被操纵 关键问题 是否有
  • VBA Excel 2010 - 直接从剪贴板粘贴

    我正在尝试直接从剪贴板粘贴到 Excel 文档中并进行转置 Dim DataObj As MSForms DataObject Set DataObj New MSForms DataObject DataObj GetFromClipbo
  • 如何在 Android Studio 中使用 4 空格宽制表符?

    我正在 android studio 中创建一个 Flutter 应用程序 在 设置 gt 编辑器 gt 代码样式 gt Dart 下 我启用了 使用制表符 并将制表符大小和缩进更改为 4 然而 main dart 文件中似乎没有任何变化
  • 阿拉伯语的 tcpdf 将字符显示为问号 '?????? ???'

    我想创建一个阿拉伯语 pdf 与我的 ms Execl 格式的文件相同 在 php 中使用 tcpdf 创建 pdf 时 阿拉伯字符显示为 分数 这些字符是从我的 Excel 文件中复制的 htmlcontent2 span color 0
  • Mac SQLite 编辑器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道可可MySQL http cocoamysql sourceforge net 但我还没有见过 SQLite 的 Mac GUI 有
  • 未定义的 C/C++ 符号作为运算符

    我注意到字符 符号 和 在 C C 中不用作运算符 有谁知道原因或历史原因吗 如果确实没有使用它 使用 define 将这些符号定义为另一个运算符 语句是否安全 通常情况下 define只接受宏名称中的有效标识符 所以你不能这样做 defi
  • 如何处理 Django 嵌套模板标签

    如何处理模板标记 内的变量 我需要为我的函数 send mail view 提供参数 urls py urlpatterns path send mail view
  • WebView2 下载进度

    需要通过WebView2获取下载进度 https learn microsoft com en us dotnet api microsoft web webview2 core corewebview2downloadoperation
  • 当我在角度中使用“key”而不是“keyCode”和“KeyboardEvent”时出现错误

    我正在尝试为输入字段 文本框 创建自定义指令 使其仅接受数字而不接受字母字符 我有以下 only numbers directive ts 文件 import Directive ElementRef HostListener from a
  • 使用 Huggingface 转换器进行命名实体识别,映射回完整实体

    我正在查看文档用于命名实体识别的 Huggingface 管道 https huggingface co transformers task summary html named entity recognition 我不清楚这些结果如何用
  • hapijs有过载保护之类的东西吗?

    如果 hapi 服务器过载 它会做什么 是否有类似的情况太忙js https www npmjs com package toobusy js通过快捷方式处理一些有错误的请求来防止服务器崩溃 是的 它嵌入在框架中 看看load关于连接set
  • C++11 的 &&(R 值引用)运算符是否废弃了“代理对象”设计模式?

    Scott Meyers 的第 30 项 更有效的 C http www amazon co uk More Effective Programs Professional Computing dp 020163371X绘制出 代理对象 编