约束函数的重载解析

5

对于调用f,是否模棱两可?因为其中一个函数比另一个函数更受限制,所以我不认为会有任何歧义。然而,GCC 12.2Clang trunk拒绝这段代码,与Clang 15MSVC 19.33MSVC trunk相反。

代码示例

template<typename...>
int f();

template<typename = void>
int f() requires true;

static_assert(sizeof(f()));

GCC产生的错误:

<source>:7:23: error: call of overloaded 'f()' is ambiguous
    7 | static_assert(sizeof(f()));
      |                      ~^~
<source>:2:5: note: candidate: 'int f() [with <template-parameter-1-1> = {}]'
    2 | int f();
      |     ^
<source>:5:5: note: candidate: 'int f() requires  true [with <template-parameter-1-1> = void]'
    5 | int f() requires true;
      |     ^
1个回答

2

只有当函数模板在其他方面等效(除了可能的返回类型)时,才会考虑来自函数模板的可行重载是否更受限制。仅仅因为调用本身可能不明确并不足够。

特别是,相应的模板参数必须是等效的,参见[temp.func.order]/6.2.2。作为参数包的模板参数(如第一个重载中的参数)与非参数包的模板参数(如第二个重载中的参数)不是等效的,参见[temp.over.link]/6.2

因此,约束对于决定哪个候选者更好没有关系。调用是不明确的。


我尝试了一下默认模板参数,但我猜转换后的模板将会遇到[temp.func.order]/6.1中所述的参数列表长度要求。因此,似乎Clang 10-15MSVC 19都不应该接受这段代码。而Clang trunk也拒绝了它,这似乎也强调了这个观点。 - 303

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接