C++ 重载解析不明确 - GCC

标签 c++ gcc c++11 standards overload-resolution

我想了解,为什么 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 & 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。没有可能的类型 C这可以使A<C,8>匹配参数类型 A<int,5> .转换是可能的并不关心推论。

参见 [temp.deduct.call]/4。由于可以通过转换构造函数和转换函数来允许转换,因此不可能考虑(所有)转换以进行类型推导。这也可能导致歧义。

关于C++ 重载解析不明确 - GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267059/

相关文章:

c++ - 霍夫曼以位存储代码

c - C 和汇编之间的链接错误

c++ - Gcc x64 函数调用

c++ - 获取 "terminating with uncaught exception of type std::length_error: vector"错误 C++

c++ - 快速JPEG编码库

c++ - 某些机器上 OpenGL 中的黑屏(PIXELFORMATDESCRIPTOR/SwapBuffer?)

c++ - 我可以使用 QSortFilterProxyModel 创建摘要/聚合模型吗?

c - 为什么 gcc 找不到 GSL?

c++ - 将一系列值映射到单个值

c++ - 用标准库(静态)编译静态库链接