【问题标题】:why does --list.end() compile?为什么 --list.end() 编译?
【发布时间】:2013-02-13 13:42:09
【问题描述】:
  • list 的 end() 返回过去的迭代器的副本,对吧?
  • 因此,list.end() 是一个右值,对吧?
  • 为列表迭代器重载的 -- 运算符函数采用非常量引用,对吗?
  • 您不能将右值绑定到非常量引用,对吧?

那是怎么回事

std::list<int> lst;
// ... 
--l.end();` 

编译?

正如正确指出的那样,我的第三点不一定是正确的。但是这段代码也可以编译呢?

struct A{};

void f(A&)
{

}
A a()
{
    return A();
}

int main()
{
    f(a());
}

【问题讨论】:

  • 第三点错了。
  • @banuj:我不明白
  • 我不同意您的第二个示例编译:ideone.com/V98wW3
  • @MarkRansom:这是 MSVC++ 扩展,由 Armen 本人确认。

标签: c++ list stl lvalue rvalue


【解决方案1】:
  • 为列表迭代器重载的 -- 运算符函数采用非常量引用,对吧?

这点是错误的。 operator-- 是成员函数,成员函数可以临时调用。您不会将任何对象作为参数传递给此成员函数。所以将右值绑定到非常量引用的问题一开始就不会出现。


至于编辑(将 rvalue 传递给f(A&amp;){}),它是一个非标准扩展。我你正在使用 Microsoft Compiler,因为我知道它有这个非标准扩展,在我看来这很愚蠢。

【讨论】:

  • 哦...对 :) 我很傻。逻辑的恢复是合理的,不是吗? :)
  • 顺便说一句,标准是否要求 -- 成为会员?还是实现定义的?
  • 其实不一定是成员函数。迭代器可以是一个指针。
  • @AndyProwl:它是std::list,所以它不能是指针(我不这么认为)。
  • @AndyProwl:向量的迭代器可能是并且大多数实现上的指针(在发布模式下)
猜你喜欢
  • 2019-05-22
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2020-12-04
  • 2020-12-16
  • 2012-10-24
相关资源
最近更新 更多