【问题标题】:Should conversion operators be considered for function template argument deduction?函数模板参数推导是否应该考虑转换运算符?
【发布时间】:2020-12-14 19:23:56
【问题描述】:

考虑以下code

template<typename>
struct S 
{
    operator S<int&>();  
};

template<typename T>
void f(S<T&>);

int main() 
{
    f(S<int&&>{});  // gcc ok
                    // clang error
}

gcc 对临时参数使用转换运算符,返回与S&lt;T&amp;&gt; 匹配的S&lt;int&amp;&gt;,并接受调用。

clang 不考虑转换运算符,无法将 T&amp;int&amp;&amp; 匹配,并拒绝调用。

那么语言所说的应该在这里发生什么?

【问题讨论】:

  • 我很困惑,请忽略。模板参数推导失败,重载解析失败,没有其他考虑,至少我认为是这样。
  • @PasserBy 是的,扣减失败,但仅在一种情况下,而不是另一种情况。我想知道哪一个是正确的,如果有的话。
  • 我的意思是 gcc 是错误的。
  • @PasserBy 好的,谢谢。如果您能找到错误报告,那就太好了。如果您知道 为什么 gcc 是错误的,那么答案也会很不错。
  • This 可以提供帮助。我猜clang是正确的...

标签: c++ templates language-lawyer template-argument-deduction


【解决方案1】:

GCC 在这里肯定是错误的:T&amp;T&amp;&amp; 在 [temp.deduct.type]/8 中是不同的行,因此不兼容。为什么这样做尚不清楚。在另一个方向上犯错会更有意义:如果参数被声明为S&lt;T&amp;&amp;&gt;,并且参数的类型为S&lt;int&amp;&gt;,那么至少会有Tieint&amp;) 这样(由于引用折叠)参数和参数类型是相同的。 (如果说涉及通用引用,也会很容易犯错误。)

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多