C 超负荷分辨率模棱两可-GCC
C++ Overload resolution ambiguous - GCC
我正在尝试理解,为什么gcc在下面的代码中选择 f(char, A<C, 5> &var)
进行过载分辨率:
template <class C, int N> struct A { };
template <class C> struct A<C, 8> { static_assert(sizeof(C) > 8, "Assertion in A<C,8>"); };
template <class C> struct A<C, 5> { static_assert(sizeof(C) < 8, "Assertion in A<C,5>"); operator A<C,8>&(); };
template <class C> void f(double, A<C,8> &var);
template <class C> void f(char, A<C,5> &var);
int main(void)
{
A<int, 5> a;
f(4., a);
}
有两个过载:
template <class C> void f(double, A<C,8> &var);
4.
精确匹配double
(无需隐式转换),但是第二个参数需要用户定义的转换。因此,此超载:exact match
&amp;user-define conversion
下一个超载,与GCC相匹配:
template <class C> void f(char, A<C,5> &var);
4.
需要隐式转换为char
,但与A<C,5>
完全匹配。GCC选择此重载以上是有什么原因?
有人可以从有关此特定情况的标准第13条中找到证据吗?任何帮助或评论将不胜感激。谢谢!
推论无法成功
template <class C> void f(double, A<C,8> &var);
和类型A<int, 5>
的参数。IE。没有可能使A<C,8>
匹配参数类型A<int,5>
的类型C
。转换是可能的不在乎扣除的。
参见[temp.deduct.call]/4。由于可以通过转换构造函数和转换功能允许转换,因此不可能考虑(所有)转换以进行类型扣除。这也可能导致歧义。
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- gcc 中的模棱两可的运算符
- GCC称将功能与多个继承过载时,称其为模棱两可,但Clang和MSVC没有
- MSVC发现这种方法调用模棱两可,而Clang / GCC则不然吗?
- 转换和移动 ctor 导致对 Clang 和 GCC 4.9.2 的模棱两可的要求
- C 超负荷分辨率模棱两可-GCC