gpt4 book ai didi

c++ - 为什么代码被clang接受而被vc++拒绝?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:13 27 4
gpt4 key购买 nike

clang 3.4 接受以下代码;而 vc++ NOV 2013 CTP 拒绝它并出现错误:

error C2668: 'AreEqual' : ambiguous call to overloaded function
template<class headT, class... tailTypes>
constexpr headT&& __GetFirst__(headT&& value, tailTypes&&...)
{
return static_cast<headT&&>(value);
};

template<class T>
constexpr bool AreEqual(const T& a, const T& b)
{
return a == b;
}

template<class headT, class... tailTypes>
constexpr bool AreEqual(const headT& head_value, const tailTypes&... tail_values)
{
return AreEqual(head_value, __GetFirst__(tail_values...))
&& AreEqual(tail_values...);
}

int main()
{
AreEqual(1, 1, 2, 1);
}

根据 C++14 标准,哪个编译器是正确的?

更新:完整的错误信息:

error C2668: 'AreEqual' : ambiguous call to overloaded function
1> d:\projects\ktl\test\main.cpp(20): could be 'bool AreEqual<headT,int>(const headT &,const int &)'
1> with
1> [
1> headT=int
1> ]
1> d:\projects\ktl\test\main.cpp(8): or 'bool AreEqual<headT>(const T &,const T &)'
1> with
1> [
1> headT=int
1> , T=int
1> ]
1> while trying to match the argument list '(const int, const int)'
1>
1>Build FAILED.

最佳答案

Clang(和 GCC)的行为是正确的。您可以阅读标准的 §14.8.2.4 [temp.deduct.partial] 了解如何完成函数模板的部分排序,但该子条款的 p8 中给出的示例直接涵盖了这种情况:

template<class... Args> void f(Args... args); // #1
template<class T1, class... Args> void f(T1 a1, Args... args); // #2
template<class T1, class T2> void f(T1 a1, T2 a2); // #3
f(); // calls #1
f(1, 2, 3); // calls #2
f(1, 2); // calls #3; non-variadic template #3 is more
// specialized than the variadic templates #1 and #2

关于c++ - 为什么代码被clang接受而被vc++拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24710542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com