成员函数 .begin() 和 std::begin()

2024-02-17

调用成员函数.begin() of std::vector and std::begin()右值会导致不同的输出,如以下测试所示:

vector<int> a{ 1, 2, 3 };

vector<int>::iterator it1 = move(a).begin(); // OK
vector<int>::const_iterator it2 = move(a).begin(); // OK

vector<int>::iterator it3 = begin(move(a)); // Error!
vector<int>::const_iterator it4 = begin(move(a)); // OK

这是我的理解:std::begin() calls const&过载(因为它缺乏&&过载),因此,它返回一个const_iterator目的。所以,返回值可以赋值给const_iterator但不是iterator.

  1. 我的理解正确吗?
  2. 为什么std::begin()没有右值重载?

只是我用过的一个笔记move(a)演示调用.begin() and std::begin()关于右值。当然,它可以被任何右值对象替换.begin() and std::begin()都有明确的定义。

Edit:这是我在哪里遇到这个问题的真实例子。我已经简化了很多只是为了传达这个想法std::begin()在右值上调用。所以,自从row_matrix是一个代理类,调用应该没有问题begin and end由于底层对象是相同的,因此在右值上。

class matrix_row;
class row_iterator;

class matrix {
public:
    matrix_row row(int i);
    // other members
};  

class matrix_row { // <- proxy class representing a row of matrix
public:
    row_iterator begin();
    row_iterator end();
    // other members
private:
    int row_;
    matrix& matrix_;
};

class row_iterator {
    // defined everything needed to qualify as a valid iterator 
};

matrix m(3,4);

for(auto x = m.row(1).begin(); x != m.row(1).end(); ++x) {
    *x /=2; // OK
}

for(auto x = begin(m.row(1)); x != end(m.row(1)); ++x) {
    *x /= 2; // Error
}

直到最近,超载.begin()通过调用对象的右值/左值是不可能的。

添加它后,将此类更改改造到标准库中理论上可能会破坏现有代码。

破坏现有代码是很糟糕的,糟糕到足以留下遗留的怪癖,除非有相当有力的证据表明此类代码不存在,会有明确的诊断,和/或更改的效果确实有用。

So .begin()忽略了其右价值*this.

没有这样的限制std::begin,除了可能希望与.begin().

理论上,标准容器对被调用没有正确的响应std::begin在右值上下文中。 “正确”的互动方式std::move或右值是您不应该关心调用完成后移出对象的状态。

这意味着(逻辑上)您只能获取两个迭代器之一(开始或结束)。

在这种情况下,正确的语义是什么是一个很大的困惑。我编写了适配器,在这种情况下(例如,对右值的伪开始/结束调用)生成移动迭代器,但这样做通常非常令人惊讶,我认为这最终是一个糟糕的举动。

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

成员函数 .begin() 和 std::begin() 的相关文章

  • C++ 天花板函数的奇怪结果

    我一直在尝试天花板功能并得到一些奇怪的结果 如果我对十进制数乘以百执行 ceil 运算 我会得到一定的结果 但是 如果我直接对该乘法的结果执行 ceil 我会得到完全不同的输出 另一个问题是 这些不同的结果仅发生在某些数字上 任何帮助 将不
  • lambda 表达式到函数指针的转换

    这是这个问题的后续问题 Lambda 如何作为参数传递 https stackoverflow com questions 3321283 c0x lambda how can i pass as a parameter 据推测 MSDN
  • 子进程中的变量修改

    我正在研究科比和奥哈拉伦的作品Computer Systems A Programmer s Perspective 练习 8 16 要求程序的输出如下 我更改了它 因为他们使用了一个你可以在他们的网站上下载的头文件 include
  • 如何在C中将2个4位无符号数组合成1个8位数

    我有 2 个 4 位数字 X0X1X2X3 和 Y0Y1Y2Y3 我想将它们组合起来 这样我就可以创建一个像这样的 8 位数字 X0X1X2X3 Y0Y1Y2Y3 gt X0Y0X1Y1X2Y2X3Y3 我知道如何连接它们以创建X0X1X1
  • 如何通过C#在SQLite数据库中写入变量DateTime值?

    我很新C and SQLite数据库并有一些变量存储在 SQLite 数据库中TimeStamp 这是我的代码 DateTime now DateTime Now m dbConnection new SQLiteConnection Da
  • 用C#发送USSD?

    我想编写一个在 Windows Mobile 6 上运行的简单 C 应用程序 它可以发送 USSD 消息 有没有任何图书馆可以帮助我做到这一点 或者是否有任何示例解释如何使用线路发送USSD http msdn microsoft com
  • const_iterators 更快吗?

    我们的编码指南更喜欢const iterator 因为它们比正常的要快一点iterator 当您使用时 编译器似乎会优化代码const iterator 这真的正确吗 如果是的话 内部到底发生了什么使得const iterator快点 编辑
  • WCF 客户端返回空数组 - XML 响应似乎正常

    我正在尝试为我们的 Intranet 上托管的 Web 服务创建一个简单的 WCF 客户端 C 使用 Fiddler 和 SoapUI 我可以看到请求和响应似乎正常 但是当我运行代码时返回一个空数组 我会尝试只粘贴相关的行 但会是很多东西
  • 泛型类上的 DebuggerDisplay

    我在应用时遇到问题DebuggerDisplay泛型类的属性 DebuggerDisplay foo class Foo DebuggerDisplay Bar t class Bar
  • 使用 MessagingCenter 和标准 .NET 事件处理程序向感兴趣的各方通知更改有什么区别?

    使用 MessagingCenter 和标准 NET 事件处理程序向感兴趣的各方通知更改有什么区别 下面演示了同一事物的两个 未经测试的 实现 public class FooClass public event EventHandler
  • 使用 INF 文件 C++ 以编程方式安装驱动程序

    这里有人可以告诉我如何安装第 3 方设备驱动程序吗 如果提供了所有必需的文件 即 inf 文件 sys 等 则以编程方式进行 这 该解决方案应运行的最低操作系统是Windows2000 我尝试复制 inf文件放入Win文件夹 INF文件夹和
  • C语言中的array、&array、&array[0]有什么区别? [复制]

    这个问题在这里已经有答案了 在学习C语言中的数组和指针时 我很困惑 为什么ch ch ch 0 彼此相等 而sptr sptr sptr 0 却不相等 这是我的源代码 int main void char ch 7 1 2 3 4 5 6
  • 谷歌基准迭代的意义是什么?

    我正在使用 Google Benchmark 来测量某些代码的执行时间 例如 我编写了以下代码来测量其执行时间性能 include
  • 如何在 .NET 中自定义 JSON 枚举的反序列化?

    我有以下示例 C 代码 它是使用 svcutil exe 应用程序从 xsd 自动生成的 DataContract public enum Foo EnumMember Value bar Bar 1 EnumMember Value ba
  • C++头文件问题

    我在处理类时尝试了一些 C 代码 这个问题出现在我身上 并且让我有点烦恼 我创建了一个包含类定义的头文件和一个包含实现的 cpp 文件 如果我在不同的 cpp 文件中使用此类 为什么要包含头文件而不是包含类实现的 cpp 文件 如果我包含类
  • Roslyn,通过 hostObject 传递值

    我正在尝试通过 hostObject 发送一个类 但显然它不想工作 using Roslyn Compilers using Roslyn Compilers CSharp using Roslyn Scripting using Rosl
  • 我们可以使用 C# 录制发送到扬声器的声音吗

    我有一个软件 SoundTap Streaming Audio Recorder 它记录发送到扬声器的任何音频 无论流是来自网络还是来自某些文件或麦克风 我可以在桌面应用程序中制作这样的应用程序 以便我可以录制发送到扬声器的流 无论来源如何
  • int 类型的构造函数

    考虑到成本 这些情况是否相同 case 1 int a 5 case 2 int a 5 case 3 int a a 5 这三种语法是不同的 请耐心等待 我使用用户定义类型而不是 int 稍后我将回到 int T a 5 Direct i
  • 致命:所有操作都需要OperationId。请为路径的“获取”操作添加它

    我正在使用 AutoRest 从 swagger json 生成 api 的客户端 输出是 AutoRest code generation utility cli version 3 0 6187 node v10 16 3 max me
  • “while(true) { Thread.Sleep }”的原因是什么?

    我有时会遇到以下形式的代码 while true do something Thread Sleep 1000 我想知道这是否被认为是好的做法还是坏的做法以及是否有任何替代方案 通常我在服务的主函数中 找到 这样的代码 我最近在 Windo

随机推荐

  • Django 1.9 JSONField 更新行为

    我最近更新到 Django 1 9 并尝试更新一些模型字段以使用内置 JSONField 我正在使用 PostgreSQL 9 4 5 当我尝试创建和更新对象的字段时 我遇到了一些奇怪的事情 这是我的模型 class Activity mo
  • Rails 4 多域应用程序,为每个域设置了语言环境 i18n 语言环境

    在 Rails 4 多域应用程序中 我需要为每个域提供 4 种语言的一组区域设置文件 总共 3 个域 有些翻译在领域之间重叠 但其中一些非常具体 所以我正在考虑一种类似于这样的结构 config locales en yml fr yml
  • Android Studio 4.1 在 Mac 中卡在加载屏幕

    从昨天开始 我的 Android Studio 就一直停留在加载屏幕上 X X 我尝试过的 正在重新启动计算机 清除垃圾文件和日志 完全卸载然后重新安装Android Studio 遵循许多不同的解决方案 例如 其中之一是here http
  • 如何在 :before 伪类中设置 SVG 图像的大小?

    我想在 CSS 中显示图像 before元素 withimage before content url path to image svg display block height 20px width 20px 问题是 height an
  • 绘制词频和 NLTK

    我有一个包含各种单词的文件 我想计算文档中每个单词的频率并绘制它 但是 我的情节没有显示结果 这x axis必须包含单词 并且y axis频率 我在用NLTK NumPy and Matplotlib 这是我的代码 也许我做错了什么 def
  • 是否有直接指示 RESPONSE.REDIRECT 转到上一页?

    我有一个 Web 应用程序 服务台票证系统 带有一个收件箱来监视传入的请求 并制作了一些过滤按钮来帮助用户根据请求者姓名 创建日期等来安排请求 每个过滤器都会简单地调用同一页面 但会向查询字符串添加一些代码 例如 如果用户按下标有 Sort
  • 在 jinja2 循环中对 dict 的 dict 进行排序

    我如何对字典进行排序 my dict abc name B is sth True xyz name A is sth True by name在金贾 我试过了 for id data in my dict dictsort by valu
  • Python ImportError 没有名为 crypto.PublicKey.RSA 的模块

    当我尝试执行 python 程序时 我从终端得到这个 Traceback most recent call last File ring py line 1 in
  • 使用副本的 Microsoft.Web/sites/hostNameBindings 资源的 ARM 模板部署

    我对一系列 Azure 数据中心位置使用复制操作 以便为每个位置部署应用服务计划和网站 我能够创建流量管理器配置文件并使用复制对象将每个位置的端点添加到流量管理器配置文件中 当我尝试将每个网站的 CNAME 设置为我的自定义域名时 请按照说
  • 如何使用 don't cares 参数化 case 语句?

    我有一条称为输入的电线 我想检测前导的数量 我正在尝试创建一个模块 该模块使用下面的 case 语句根据前导零的数量更改输出数据 然而 输入的大小是可参数化的 如果 X 是固定值 4 我将创建一个 case 语句 case input 4
  • 客户端服务器端模板nodejs

    我正在使用 Node js 开发一个 Web 应用程序 我最初只想使用服务器端 hbs 模板 但后来我发现了客户端模板的主干 我发现它可以从服务器获取数据 然后使用 hbs 模板显示它 而不是服务器端生成整个 html 页面并发送 但后来我
  • 有没有比升级到 Visual Studio 2010 Ultimate 更便宜的负载测试方法

    我有 Visual Studio 2010 Professional 许可证 所以 Ultimate 还很遥远 我想要的只是进行几周左右的负载测试 有没有一种更便宜的方法来获得 VS2010 Ultimate 的负载测试部分 或者具有负载测
  • 存储库应该实现 UnitOfWork 吗?

    在 DDD 模式中 工作单元应该与存储库耦合吗 我见过几个不同的示例 包括实现工作单元接口的存储库 实现工作单元本身行为的存储库 以及具有表示工作单元的属性以便可以在各个工作单元之间共享的存储库 UoW 生命周期内有多个存储库实例 对于后者
  • MBProgressHud 与 gif 图像

    我可以使用 gif 图像代替默认加载指示器吗 到目前为止我正在使用这段代码但没有得到任何结果 谁能建议这段代码有什么问题吗 import UIImage GIF h void showLoadingHUD NSString title se
  • 启用 mod_http2 并在conf文件中设置协议后,HTTP/2配置未运行[重复]

    这个问题在这里已经有答案了 在看似正确的安装之后 HTTP 2 似乎并未运行 我运行的是 CentOS 7 我安装了最新版本的 Apache 版本 httpd 2 4 35 5 el7 x86 64 并一直在尝试让 HTTP 2 正常工作
  • 自定义实体具体化

    有没有办法使用 EF6 注入自定义对象实例创建器 我需要做的是在矩阵化发生之前向 EF 提供实体实例 基本上我希望能够使用非无参数构造函数定义 POCO 实体 以便能够使用 DI 聚合 最终使用 EF 进行持久化 我知道我可以使用对象物化事
  • HTML 表单只读 SELECT 标签/输入

    根据 HTML 规范 selectHTML 中的标签没有readonly属性 只有一个disabled属性 因此 如果你想阻止用户更改下拉菜单 你必须使用disabled 唯一的问题是禁用的 HTML 表单输入不会包含在 POST GET
  • 如何使用多个其他列中的所有非 NA 值创建新列?

    我想创建一个列 d 其中包含其他列中的所有非 NA 值 我尝试了 ifelse 但无法弄清楚如何使其以正确的方式嵌套 以便也包含 c 列中的值 也许应该使用 ifelse 之外的其他东西 这是一个 虚拟 数据框 a lt c NA NA N
  • Chart.js 中的水平条形图

    我正在尝试使用 Chart js 2 3 0 绘制水平条形图 var MeSeContext document getElementById MeSeStatusCanvas getContext 2d var MeSeData label
  • 成员函数 .begin() 和 std::begin()

    调用成员函数 begin of std vector and std begin 右值会导致不同的输出 如以下测试所示 vector