向量迭代器对于包装器类不可取消引用(没有超出 end() 取消引用)

Vector iterator not dereferencable for a wrapper class (Without beyond the end() dereferencing)

本文关键字:引用 取消 可取消 end 于包装 迭代器 包装 向量 不可取      更新时间:2023-10-16

我试图理解在基于范围的 for 循环的情况下参数相关查找的行为。我将我的类型的开始和结束实现为与我的类型相同的命名空间中的自由函数。我不断收到运行时断言失败错误。

表达式:向量迭代器不可去引用

这是我编写的示例代码:

namespace my {
    struct MyType {
        std::vector<int> hiddenData;
        MyType(int i) : hiddenData(i) {}
    };
    auto begin(MyType obj) {
        return obj.hiddenData.begin();
    }
    auto end(MyType obj) {
        return obj.hiddenData.end();
    }
}
void test() {
    my::MyType m(5);
    for (auto& e : m)
        std:: cout << e << std:: endl;
}

感谢您查看它!

这是一个问题:

auto begin(MyType obj)

MyType 是一个临时对象。 因此,当函数返回时,此对象不再存在,因此返回的迭代器无效。

相反,传递一个引用:

auto begin(MyType& obj)

auto end(MyType& obj)