使用迭代器范围

时间:2016-05-04 16:49:41

标签: c++ stl iterator containers

我想(复制)将单个元素附加到某个(类似STL的)容器,但我可以使用的是basic_string & append(InputIt first, InputIt last) - 就像初始化或将元素附加到容器的接口一样。

执行以下操作是错误的:

#include <vector>

struct container
{

    template< typename input_iterator >
    void init(input_iterator const beg, input_iterator const end)
    {
        v.insert(v.cend(), beg, end);
    }

    template< typename input_iterator >
    void append(input_iterator beg, input_iterator const end)
    {
        while (beg != end) {
            v.push_back(*beg);
            ++beg;
        }
    }

private:
    std::vector< int > v;
};

#include <cstdlib>

int main()
{
    int i = 123;
    container c;
    c.init(&i, &i + 1);
    int j = 555;
    c.init(&j, &j + 1);
    return EXIT_SUCCESS;
}

具体来说,我担心f(&i, &i + 1)构造是否有效(假设一元operator &是否过载)?

1 个答案:

答案 0 :(得分:6)

是的,它完全有效。来自[expr.unary.op]:

  

出于指针运算(5.7)和比较(5.9,5.10)的目的,不是以这种方式获取地址的数组元素的对象被认为属于具有{{1}类型的一个元素的数组}。

T只是指向一个超过该对象结尾的对象,为此目的是一个超过该类型的第一个数组的结尾的一个,这是一个完全合法的参考,根据[expr.add]:

  

如果指针操作数和结果都指向同一个数组对象的元素,或者一个过去的元素   数组对象的最后一个元素,评估不应产生溢出;否则,行为是   未定义。

作为旁注,您的&i + 1功能是append()功能的严格执行。