gpt4 book ai didi

c++ - gsl::span 和 gsl::span 重载不明确

转载 作者:太空狗 更新时间:2023-10-29 21:16:11 25 4
gpt4 key购买 nike

C++ Core Guidelines促进实践using span .

问题在于 const 和可变范围。这是我尝试做的:

auto foo(gsl::span<int>);         // 1st
auto foo(gsl::span<const int>); // 2nd

但是如果没有明确的span 就不能调用它们参数的转换/构造:

std::vector<int> v;
const std::vector<int> cv;
const std::vector<int>& crv = v;

// ambiguous
// want to call 1st
foo(v);

// ambiguous, although 1st is illegal (static_assert kicks in)
// want to call 2nd
foo(cv); // ambiguous
foo(crv); // ambiguous

处理这个问题的正确方法是什么?

这看起来应该是微不足道的,类似于 const T&T&重载,但它不是(或者我只是没有看到它)。

只是为了在同一页面上,foo(gsl::span<int>{v})很麻烦,我想避免它,让调用者简单:foo(v) .


我概括了这个问题,但以防万一这是一个 XY 问题,这就是我实际尝试做的事情:

auto split(gsl::cstring_span<> str) -> std::vector<gsl::cstring_span<>>;
auto split(gsl::string_span<> str) -> std::vector<gsl::string_span<>>;

并希望通过 [const] char * 调用, [const] string等参数。

最佳答案

根据 P0122R1 span 的相关构造函数类是:

template <class Container>
constexpr span(Container& cont);

所以不幸的是,你所有的 3 个例子都是错误的。除非 Container::value_type& 要求从重载决议中删除此构造函数,否则第二个可以合法化。可转换为 span::value_type& Container与跨度兼容。

即使我们这样做,我也看不到允许数字 1 和 3 的方法,因为这两个重载都只需要一个用户定义的隐式转换。

通常的解决方法是添加另一个级别:

template<class T>
auto foo( T && x ) { return foo_impl( as_span(std::forward<T>(x) ) ); }

auto foo_impl(gsl::span<int>); // 1st
auto foo_impl(gsl::span<const int>); // 2nd

请注意 as_span不在 P0122R1 中,但它在 Microsoft GSL 中实现。它之所以有效,是因为它检查类型并返回 span<typename Container::value_type> .

关于c++ - gsl::span<T> 和 gsl::span<const T> 重载不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35841512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com