在向量构造函数中的空迭代器范围

Meg*_*ozg 5 c++ stl

在向量构造函数中传递空迭代器范围是否有效?即它是以下代码中的未定义行为?

std::set<int> empty_set;
std::vector<int> target_vector(empty_set.begin(), empty_set.end());
Run Code Online (Sandbox Code Playgroud)

根据cppreference解释,这个构造函数:

使用范围[ first,last)的内容构造容器.

它的意思是first必须可以解除引用吗?

Tob*_*ght 8

std::vector从空范围构造一个是完全合法的.如果first==last,新向量将没有元素,并且first不会被解除引用.

您拥有的代码是明确定义的,并且符合您的期望.


由于指针可以用作迭代器,这甚至意味着这个代码定义良好(并返回零):

#include <vector>

int main()
{
    int const* const p = nullptr;
    std::vector<int> v(p, p);
    return v.size();
}
Run Code Online (Sandbox Code Playgroud)