gpt4 book ai didi

c++ - 在取地址的上下文中,哪个是最专业的函数模板?

转载 作者:行者123 更新时间:2023-12-04 11:28:05 26 4
gpt4 key购买 nike

考虑这个 example

#include <iostream>
template<class T>
void fun(T&){ //#1
std::cout<<"selected\n";
}

template<class T>
void fun(T&&){} //#2

int main() {
void(*ptr)(int&) = &fun; //#3
}
GCC 和 Clang 都报告错误,诊断为“模棱两可”。根据[temp.deduct.funcaddr#1],这两个函数模板在 #3中都是可行的.因此,[over.over#5] 需要在这里申请

Any given function template specialization F1 is eliminated if the set contains a second function template specialization whose function template is more specialized than the function template of F1 according to the partial ordering rules of [temp.func.order].


判断 #1之间哪个更专业和 #2 , [temp.deduct.partial#3.3] 适用于他们

The types used to determine the ordering depend on the context in which the partial ordering is done:

  • [...]
  • In other contexts the function template's function type is used.


因此,P 和 A 曾经参与 偏序应该分别是那两个函数模板的函数类型。取 #2的函数类型作为 P 和 #1 的函数类型作为 A. 推断 P来自 A根据 [temp.deduct.type#10] 成功

If P and A are function types that originated from deduction when taking the address of a function template ([temp.deduct.funcaddr]) or when deducing template arguments from a function declaration ([temp.deduct.decl]) and Pi and Ai are parameters of the top-level parameter-type-list of P and A, respectively, Pi is adjusted if it is a forwarding reference ([temp.deduct.call]) and Ai is an lvalue reference, in which case the type of Pi is changed to be the template parameter type (i.e., T&& is changed to simply T).


相反,由于我们无法推导出 T&来自 T&& ,因此是 #1 处的函数模板比 #2 处的函数模板更专业.因此 #2的特化应该从集合中删除。最终,该集合只包含 #1 的一个特化。 .这里应该是明确的。为什么 GCC 和 Clang 说获取地址不明确?

最佳答案

根据您自己的分析,GCC 和 Clang 在重载解析中的屈服和歧义是错误的。
这可以说与 CWG 1164 有关,尽管不是 in the context of a function call ,根据 CWG 1164 [],其意图应该与函数调用的情况类似。重点 矿]:

1164. Partial ordering of f(T&) and f(T&&)

Section: 13.10.3.2 [temp.deduct.call] Status: C++11 Submitter: US Date: 2010-08-03

[Voted into the WP at the November, 2010 meeting.]

N3092 comment US 77 The following example is ambiguous:

template<typename T> int f(T&);
template<typename T> int f(T&&);
int i;
int j = f(i);

Because of the special deduction rule for lvalues passed torvalue-reference parameters, deduction produces f(int&) for bothtemplates, and they are indistinguishable.

Because f(T&) accepts a strict subset of the things that f(T&&) does,it should be considered more specialized by the partial orderingrules.

Proposed resolution (August, 2010): [...]


您自己的分析得出了一个与 CWG 1164 一致的过载结果,但对于另一个上下文,CWG 1164 中从未取消过,并且(可以说)不太常见。

我们可能会注意到 GCC 和 Clangs 都将 CWG 1164 的决议标记为 ?/ Unknown :
- GCC: C++ Defect Report Support in GCC
- C++ Defect Report Support in Clang
因此,它可能只是部分实现(OP 的示例比 CWG 1164 的示例更像是一个角落用例)。

关于c++ - 在取地址的上下文中,哪个是最专业的函数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68949303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com