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

标签 c++ list stl lvalue rvalue

  • list 的 end() 返回尾后迭代器的拷贝,对吧?
  • 因此,list.end() 是一个右值,对吗?
  • 为列表迭代器重载的 -- 运算符函数采用非常量引用,对吧?
  • 不能将右值绑定(bind)到非常量引用,对吗?

那怎么会呢

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

编译?

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

struct A{};

void f(A&)
{

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

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

最佳答案

  • the -- operator-function overloaded for list iterator takes a non-const reference, right?

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


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

关于c++ - 为什么 --list.end() 编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15117357/

相关文章:

c++ - 计算一个非常大的矩阵的逆

python - 给定元组列表查找区间

c++ - 定义常量列表

c++ - std::list remove_if 使用堆栈中的状态

architecture - 数据访问层 : Exposing List<>: bad idea?

c++ - std::sort 和 std::stable_sort 在实践中的性能差距有多大?

c++ - 在 STL 集中设置 lower_bound

c++ - NUMA:如何检查分配了 C++ 数组的 RAM 的哪一部分?

c++ - 使用 typeid 在派生类之间进行比较

c++ - 将 std::string 转换为小写内部函数