Ambiguous/rvalue 个参数导致编译器选择不正确的重载

Ambiguous/rvalue arguments cause compiler to choose incorrect overload

我有一个名为 Vec 的自制模板 class,它是 std::vector<T>

的苍白影子

为了避免 re-inventing 轮 assign 的 header 重载复制自:std::vector::assign

..所以

作为测试 Str class 的一部分,..测试代码也是 运行 针对 std::vector<T> 以确保等效输出...

如果使用 std::vector<T> 则编译器将选择正确的重载:

然而,当使用 Vec<T> 时,编译器坚持选择不正确的重载:

通过在使用前将 args 转换为左值有一个明显的解决方法:

问题: 鉴于 Vec<T>std::vector<T> 对它们各自的 assign 使用相同的 header 重载 ... std::vector<T> 如何能够在不混淆编译器的情况下实现右值 arg?

[sequence.reqmts]/14 For every sequence container defined in this Clause and in Clause 21:

(14.2) — If the member functions of the forms:

template <class InputIterator> // such as insert()
rt fx1(const_iterator p, InputIterator first, InputIterator last);
template <class InputIterator> // such as append(), assign()
rt fx2(InputIterator first, InputIterator last);
template <class InputIterator> // such as replace()
rt fx3(const_iterator i1, const_iterator i2, InputIterator first, InputIterator last);

are called with a type InputIterator that does not qualify as an input iterator, then these functions shall not participate in overload resolution.

这通常是通过一点 SFINAE 来实现的。您可以查看您最喜欢的标准库实现的 headers 以了解详细信息。