【问题标题】:Ambiguous/rvalue arguments cause compiler to choose incorrect overload模棱两可/右值参数导致编译器选择不正确的重载
【发布时间】:2017-03-01 15:56:53
【问题描述】:

我有一个名为Vec 的自制模板类,它是std::vector<T> 的一个苍白阴影

为避免重新发明轮子,assign 的标头重载复制自:std::vector::assign

..所以

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

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

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

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

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

【问题讨论】:

  • 向我们展示有问题的代码,而不是您假设/期望的代码。
  • 帖子已经显示了有问题的代码。我没有做任何假设,也没有期望。
  • 提供你的实现的minimal reproducible example

标签: c++ overloading rvalue ambiguous


【解决方案1】:

[sequence.reqmts]/14 对于本条款和条款 21 中定义的每个序列容器:

(14.2) — 如果表单的成员函数:

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);

使用不符合输入迭代器条件的类型InputIterator 调用,则这些函数不应参与重载决议。

这通常通过一点 SFINAE 来实现。您可以查看您喜欢的标准库实现的标头以获取详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2011-06-19
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多