std::from_range不支持显式转换

编程语言 2026-07-09

我正在尝试在模板代码中的输入范围上创建一个 vector。与其使用 begin - end 构造函数,我认为 std::from_range 构造函数在可读性和对非容器类型的支持方面会更好。(当然 std::begin 也是另一种选项。)然而,似乎 from_range 构造函数在进行显式转换时不起作用。

#include <array>
#include <print>
#include <ranges>
#include <string>
#include <string_view>
#include <vector>

int main()
{
    constexpr std::array<std::string_view, 3> arr { "one", "two", "three" };
    std::vector<std::string> vec1(std::from_range, arr);
    std::vector vec2 = arr | std::ranges::to<std::vector<std::string>>();
    std::vector<std::string> vec3(arr.begin(), arr.end());
    std::println("{}", vec2);
}

Try it: https://godbolt.org/z/xace44h9G

进一步调查后,似乎 std::convertible_to 需要显式转换。

这个决定背后的理由是什么? 我是否必须使用 ranges::to 来支持所有转换,而只使用 from_range 来允许隐式转换?

解决方案

Both the from_range constructor and ranges::to require implicit conversion validity, but unlike the former, ranges::to also supports nested creation, which is why it works.

array<string_view, 3> 的值类型,即 string_view,不能隐式转换为 vector<string> 的值类型,即 string。因此,这一级别的创建无效。

然而,由于 vector<string> 是一个嵌套容器,ranges::to 递归地检查该容器的值 string 是否可以通过输入范围中的元素 string_view,并通过 ranges::to 来创建。

因为 string_view 的值类型,即 char,可以隐式转换为 string 的值类型,也就是 char,所以 string 对象将通过嵌套的 ranges::to 创建,随后整个 vector<string> 将被创建。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章