9
  • list 会end()返回一个过去的迭代器的副本,对吗?
  • 因此,list.end()是一个右值,对吧?
  • 为列表迭代器重载的 -- 运算符函数采用非常量引用,对吗?
  • 您不能将右值绑定到非常量引用,对吗?

那么怎么会

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

编译?

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

struct A{};

void f(A&)
{

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

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

1 回答 1

12
  • 为列表迭代器重载的 -- 运算符函数采用非常量引用,对吗?

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


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

于 2013-02-27T16:40:13.513 回答