为什么--list.end()编译?

Arm*_*yan 9 c++ stl list rvalue lvalue

  • list's end()返回一个过去的迭代器的副本,对吗?
  • 因此,list.end()是一个右值,对吧?
  • 为列表迭代器重载的 - operator-function采用非const引用,对吧?
  • 你不能将rvalues绑定到非const引用,对吗?

怎么会这样呢

std::list<int> lst;
// ... 
--l.end();` 
Run Code Online (Sandbox Code Playgroud)

编译?

正确指出,我的第三点不一定正确.但那么这个代码又如何编译呢?

struct A{};

void f(A&)
{

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

int main()
{
    f(a());
}
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 12

  • 为列表迭代器重载的 - operator-function采用非const引用,对吧?

这一点是错误的.的operator--是一个成员函数和成员函数可以在临时被调用.您不会将任何对象作为参数传递给此成员函数.因此,首先不会出现将rvalue绑定到非const引用的问题.


作为用于编辑(通过右值f(A&){}),这是一个非标准扩展.我你正在使用微软编译器,因为我知道它有这个非标准的扩展,在我看来是愚蠢的.