char*和char [N]的模糊错误

Ton*_*ony 8 c++ templates

有人可以帮助我理解这是否是正确的行为.

考虑这个例子:

#include <iostream>
using namespace std;

template <typename T>
struct test {
};

template <typename T>
bool operator==(const test<T>& obj, const T* arr) {
    return true;
}

template <typename T, size_t TN>
bool operator==(const test<T>& obj, const T (&arr)[TN]) {
    return false;
}

int main() {
    cout << ( test<char>() == "string" ) <<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc 4.7.3,它可以很好地编译并按预期输出"0".

但是使用Visual Studio编译器会报告ambiguous error (C2593).

在这种情况下谁是对的,对此有什么standard看法?

谢谢.

Die*_*ühl 4

使用gccclang的最新版本(即开发分支的最新负责人)也显示出歧义。我本以为采用数组的重载更好,但代码似乎不明确。不过,我还没有找到标准中的相关条款。

  • 关键点是恒等和数组到指针转换的等级是相同的:*完全匹配*,因此没有一个转换序列(无转换/数组到指针)比另一个更差。 (3认同)
  • +1我相当确定它是由 14.8.2.4 `[temp.deduct.partial]` 和 14.5.6.2 `[temp.func.order]` 驱动的。如果说该标准的这些部分“内容丰富”,那就太轻描淡写了。尽管如此,我已经通过实际跑腿工作回答了类似的问题(现在不记得了)并相信你是正确的,所以+1。 (2认同)