【问题标题】:Function template overloads resolution confusion函数模板重载解析混乱
【发布时间】:2016-07-11 03:27:17
【问题描述】:

我想知道如何解决对std::make_optional 这两个重载的调用:

template< class T >
constexpr std::optional<std::decay_t<T>> make_optional( T&& value );

template< class T, class... Args >
constexpr std::optional<T> make_optional( Args&&... args );

我知道没有像make_optional(123) 这样的显式模板参数的调用会调用第一个,但是make_optional&lt;int&gt;(123) 呢?将选择哪个重载,按照什么规则?

更新:如果我写make_optional&lt;string&gt;("hello world"),我将调用第二个重载(即使字符串文字可以隐式转换为string),对吗?

【问题讨论】:

标签: c++ templates c++11 c++14 c++17


【解决方案1】:

重载解决方案从确定可行的候选者开始,选择具有最佳转换顺序的候选者,然后查看决胜局列表。


make_optional(123) 只有一个可行的候选者,因为T 是第二个重载中的非推断上下文。因此,它无疑是最可行的候选者。


make_optional&lt;int&gt;(123) 给了我们两个可行的候选人:

  • make_optional(int&amp;&amp; )[T=int]
  • make_optional&lt;int&gt;(int&amp;&amp; )[T=int, Args={int}]

该函数采用相同的参数 (int&amp;&amp;),因此它们在相同的转换序列下同样可行。第一个重载是比第二个重载更专业的函数模板(因为它采用单个参数而不是可变参数包),所以它是首选。


make_optional&lt;string&gt;("hello world") 给了我们两个可行的候选人:

  • make_optional(string&amp;&amp; )[T=string]
  • make_optional&lt;string&gt;(const char(&amp;)[12] )[T=string, Args={const char (&amp;)[12]}]

在这里,这两个函数不采用相同的参数 - 第一个采用 string&amp;&amp;(需要用户定义的字符串文字转换),第二个采用 const char(&amp;)[12](精确匹配)。因此,第二个重载具有更好的转换顺序,是首选。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多