VC ++ 2012中意外的模棱两可的重载解决方案

Sneftel

Visual C ++2012。代码。我认为应该编译;编译器表示不同意。我将再现范围缩小到:

struct  B { };

void foo(B* b, signed int si) { } // Overload 1
void foo(B const* b, unsigned int ui) { } // Overload 2

int main()
{
    B b;
    unsigned int ui;
    foo(&b, ui);
}

因此,我们有两个候选对象可以解决过载问题。对于第一个重载,第一个参数完全匹配,第二个参数需要整数转换(无符号到有符号)。对于第二个重载,第二个参数完全匹配,第一个参数需要进行cv调整(因为&b它是指向非const的指针)。

现在,这似乎应该是完全明确的。对于“过载1”,第一个参数是标准有关过载分辨率的部分所定义的“完全匹配”,而第二个参数是“转换”。对于“过载2”,两个参数均为“完全匹配”(资格转换与身份相同)。因此(我的推理显然是不完美的),应该选择“过载2”,不要有歧义。但是:

a.cpp(12): error C2666: 'foo' : 2 overloads have similar conversions
    a.cpp(6): could be 'void foo(const B *,unsigned int)'
    a.cpp(5): or       'void foo(B *,int)'
    while trying to match the argument list '(B *, unsigned int)'
    note: qualification adjustment (const/volatile) may be causing the ambiguity

无论是在默认方言还是在C ++ 11中,GCC的代码似乎都很好(感谢IDEOne!)。因此,我很乐意将此归结为MSVC中的错误,但是(a)您知道他们对那些认为自己的错误是编译器错误的人的看法,并且(b)这似乎是一个非常明显的错误,即在一致性测试期间会发出危险信号的排序。

这是不符合要求的MSVC还是不符合要求的GCC?(或两者兼有?)关于超载分辨率的推理是否合理?

恶魔

MSVC是正确的。

gcc 4.9.0说:

警告:ISO C ++表示这些含义不明确,即使第一个最差的转换比第二个最差的转换要好:[默认启用]

clang 3.4.1同意这两个函数是模棱两可的。

尽管B* => B*B* => B const*两者都具有完全匹配排名,但对于over.ics.rank / 3,前者仍然是更好的转换顺序;(根据示例)这是为了确保:

int f(const int *);
int f(int *);
int i;
int j = f(&i); // calls f(int*)

从over.ics.rank / 3:

daccess-ods.un.org daccess-ods.un.org如果标准转换序列
S1仅在标准转换方面有所不同,并且分别产生相似的类型T1和T2(4.4),并且cv限定签名,则标准转换序列S2比标准转换序列S2更好。类型T1是类型T2的cv资格签名的适当子集。[...]

而且,当然unsigned int => unsigned int比更好unsigned int => signed int因此,在两个重载中,一个重载在第一个参数上具有更好的隐式转换序列,另一个重载在第二个参数上具有更好的隐式转换序列。因此,无法按over.match.best/1区分它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用initializer_list的模棱两可的重载解决方案

来自分类Dev

过载解决方案:这怎么不模棱两可?

来自分类Dev

过载解决方案:这怎么不算模棱两可?

来自分类Dev

VC ++多项目解决方案

来自分类Dev

'std :: cin >>'中'operator >>'的模棱两可的重载

来自分类Dev

解决模棱两可的模板

来自分类Dev

VC ++中的文字类型

来自分类Dev

VC ++中的资源ID

来自分类Dev

错误:对重载函数的模棱两可的调用

来自分类Dev

为什么此方法重载模棱两可?

来自分类Dev

C ++模板,模棱两可的重载

来自分类Dev

矩阵加法:“ operator +”的模棱两可的重载

来自分类Dev

错误:“运算符==”的模棱两可的重载

来自分类Dev

C ++ libconfig模棱两可的重载

来自分类Dev

模棱两可的呼叫的默认重载

来自分类Dev

矩阵加法:“ operator +”的模棱两可的重载

来自分类Dev

C ++ libconfig模棱两可的重载

来自分类Dev

gcc中的模棱两可的重载,与msvc一起使用

来自分类Dev

Java8中的模棱两可的重载-ECJ或Javac对吗?

来自分类Dev

C ++中的重载函数为unsigned char和unsigned int导致模棱两可

来自分类Dev

C ++中的重载函数为unsigned char和unsigned int导致模棱两可

来自分类Dev

VC ++从解决方案中的非/ clr项目的函数中调用/ clr项目的函数

来自分类Dev

VC ++ 2010-将配置添加到解决方案中的单个项目失败

来自分类Dev

VC ++ 2012 Update 5可再发行

来自分类Dev

在Visual Studio 2012中的项目中,tesseract Remove_Reference模棱两可的符号

来自分类Dev

如何在SQL Server中解决模棱两可的列名?

来自分类Dev

为什么程序被拒绝为模棱两可的程序,可以通过重载解析来解决?

来自分类Dev

xpath [last()]方法中的模棱两可的错误

来自分类Dev

Lang和requestLang中的模棱两可的值

Related 相关文章

  1. 1

    使用initializer_list的模棱两可的重载解决方案

  2. 2

    过载解决方案:这怎么不模棱两可?

  3. 3

    过载解决方案:这怎么不算模棱两可?

  4. 4

    VC ++多项目解决方案

  5. 5

    'std :: cin >>'中'operator >>'的模棱两可的重载

  6. 6

    解决模棱两可的模板

  7. 7

    VC ++中的文字类型

  8. 8

    VC ++中的资源ID

  9. 9

    错误:对重载函数的模棱两可的调用

  10. 10

    为什么此方法重载模棱两可?

  11. 11

    C ++模板,模棱两可的重载

  12. 12

    矩阵加法:“ operator +”的模棱两可的重载

  13. 13

    错误:“运算符==”的模棱两可的重载

  14. 14

    C ++ libconfig模棱两可的重载

  15. 15

    模棱两可的呼叫的默认重载

  16. 16

    矩阵加法:“ operator +”的模棱两可的重载

  17. 17

    C ++ libconfig模棱两可的重载

  18. 18

    gcc中的模棱两可的重载,与msvc一起使用

  19. 19

    Java8中的模棱两可的重载-ECJ或Javac对吗?

  20. 20

    C ++中的重载函数为unsigned char和unsigned int导致模棱两可

  21. 21

    C ++中的重载函数为unsigned char和unsigned int导致模棱两可

  22. 22

    VC ++从解决方案中的非/ clr项目的函数中调用/ clr项目的函数

  23. 23

    VC ++ 2010-将配置添加到解决方案中的单个项目失败

  24. 24

    VC ++ 2012 Update 5可再发行

  25. 25

    在Visual Studio 2012中的项目中,tesseract Remove_Reference模棱两可的符号

  26. 26

    如何在SQL Server中解决模棱两可的列名?

  27. 27

    为什么程序被拒绝为模棱两可的程序,可以通过重载解析来解决?

  28. 28

    xpath [last()]方法中的模棱两可的错误

  29. 29

    Lang和requestLang中的模棱两可的值

热门标签

归档