【问题标题】:How can the compiler differentiate between the following?编译器如何区分以下内容?
【发布时间】:2012-12-12 15:02:53
【问题描述】:

看看这个...http://en.cppreference.com/w/cpp/container/vector/insert 编译器如何区分第 3 个和第 4 个,即是制作所需 int 的副本数还是填充提供的范围内的容器。

// 3rd
iterator insert( const_iterator pos, size_type count, const T& value );

// 4th
template< class InputIt >
iterator insert( const_iterator pos, InputIt first, InputIt last ); 

提前谢谢你。

【问题讨论】:

  • 所以我们都在同一个波长上,我在你所说的重载中进行了编辑(任意使用 C++11,无论是否使用 C++11,答案都应该相同) .
  • @BjörnPollex 给定std::vector&lt;double&gt;v.insert( it, 2, 0 ) 的重载决议将导致选择模板函数(选项 4),至少在 C++03 中是这样。 (在 C++11 中,措辞不同,只要类型不满足迭代器的要求,就要求模板函数从重载决议中排除。在 C++03 中,措辞要求模板形式如果InputIt 解析为整数类型,则具有与非模板形式相同的行为。)

标签: c++ vector containers


【解决方案1】:

这是编译器(或库编写者)的问题,而不是 你的。标准说,如果 InputIt 类型是这样的 可以调用表格 3,行为应该就像 表格 3 已被调用。通常,某种形式的模板 使用元编程,使模板功能 采用迭代器将转发到两个不同的函数,选择 通过基于InputIt是否可以的重载决议 是否隐式转换为 size_type (C++03),或者是否 InputIt 将是一个合法的迭代器 (C++11)。

【讨论】:

    【解决方案2】:

    iteratorconst_iterator 根本不是同一个类。然后编译器就可以毫无问题地推断出它必须使用的重载版本。

    编辑:第四个版本中的第二个和最后一个参数必须相同,并且必须遵循InputIterator 的概念。 不是 size_t 的情况,没有歧义。

    【讨论】:

    • 让我们说这是要执行的代码。仅通过查看如何判断是第一种情况还是第二种情况 mylist.insert (it,2,20);
    • 首先,您的编辑只涉及 C++11;在 C++03 中,标准 (IIRC) 是 InputIterator 类型是否为整数类型。而且您并没有真正解释所问的内容:编译器如何进行区分。
    猜你喜欢
    • 2023-03-25
    • 2021-05-15
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2016-02-08
    相关资源
    最近更新 更多