在下面的代码中,clang和EDG诊断出一个模糊的函数调用,而gcc和Visual Studio接受代码.
struct s
{
typedef void(*F)();
operator F(); //#1
operator F() const; //#2
};
void test(s& p)
{
p(); //ambiguous function call with clang/EDG; gcc/VS call #1
}
Run Code Online (Sandbox Code Playgroud)
根据C++标准草案(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf)第13.3.1.1.2节说2;
具有唯一名称call-function并具有R call-function形式的代理调用函数(conversion-type-id F,P1 a1,...,Pn an){return F(a1,...,an); }也被视为候选函数.
在上面的代码中,似乎意味着正在考虑两个调用函数定义(每个转换函数一个),但两个调用函数具有相同的签名(因此模糊性),因为转换运算符的cv限定符似乎不是在呼叫功能签名中考虑到了.
我希望用gcc和Visual Studio调用#1.因此,如果clang/EDG正确拒绝上述代码,那么有人可以说明为什么标准规定在这种情况下应该存在歧义以及哪些代码受益于代理呼叫功能的属性的原因?谁是对的:clang(3.5)/ EDG(310)或gcc(4.8.2)/ VS(2013)?