在向量构造函数中传递空迭代器范围是否有效? 即它会在以下代码中是未定义的行为吗?
std::set<int> empty_set;
std::vector<int> target_vector(empty_set.begin(), empty_set.end());
根据cppreference解释,这个构造函数:
使用范围[
first
,last
)的内容构造容器。
Doest意味着 first
必须是可解除引用的吗?
答案 0 :(得分:8)
从空范围构造std::vector
是完全合法的。如果first==last
,则新向量将不包含任何元素,并且first
将不会被解除引用。
您拥有的代码是明确定义的,并且符合您的期望。
由于指针可以用作迭代器,这甚至意味着这个代码定义良好(并返回零):
#include <vector>
int main()
{
int const* const p = nullptr;
std::vector<int> v(p, p);
return v.size();
}
答案 1 :(得分:2)
不,没有这样的要求。
它分配内存的大小std :: distance(first,last)然后在环路中复制包含。