【发布时间】:2021-07-29 20:18:30
【问题描述】:
根据[range.single.view#3],std::ranges::single_view 构造函数之一定义为:
template<class... Args> requires constructible_from<T, Args...> constexpr explicit single_view(in_place_t, Args&&... args);效果:将
value_初始化为value_{in_place, std::forward<Args>(args)...}。
为什么标准规定使用direct-list-initialization ({}) 来初始化value_?为什么不像std::optional、std::variant和std::any一样使用direct-initialization (())?
此外,std::constructible_from(std::is_constructible) 指定 T obj(std::declval<Args>()...) 格式正确,而不是 T obj{std::declval<Args>()...}。
考虑following:
ranges::single_view<std::vector<int>> sv(std::in_place, 100, 0);
std::cout << sv.begin()->size() << "\n"; // #1
std::optional<std::vector<int>> op(std::in_place, 100, 0);
std::cout << op->size() << "\n"; // #2
由于使用了不同的初始化,#1 将调用std::vector<int>{0, 100} 并打印2,而#2 将调用std::vector<int>(0, 100) 并打印100。
为什么标准指定使用大括号初始化底层值,即使它可能会导致不一致?这背后的考虑是什么?
【问题讨论】:
标签: c++ c++20 range-v3 std-ranges