我想(复制)将单个元素附加到某个(类似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 &
是否过载)?
答案 0 :(得分:6)
是的,它完全有效。来自[expr.unary.op]:
出于指针运算(5.7)和比较(5.9,5.10)的目的,不是以这种方式获取地址的数组元素的对象被认为属于具有{{1}类型的一个元素的数组}。
T
只是指向一个超过该对象结尾的对象,为此目的是一个超过该类型的第一个数组的结尾的一个,这是一个完全合法的参考,根据[expr.add]:
如果指针操作数和结果都指向同一个数组对象的元素,或者一个过去的元素 数组对象的最后一个元素,评估不应产生溢出;否则,行为是 未定义。
作为旁注,您的&i + 1
功能是append()
功能的严格执行。