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 以了解详细信息。
我有一个名为 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 以了解详细信息。