这应该是不明确的吗?(隐式演员表)

Zac*_*Saw 23 c++ standards casting

 struct A 
 {
     A(const A& src);
     A(const char* src);
 };
 struct B 
 {
     operator A();
     operator char*();
 };
 void test()  
 {
     B v;
     A s(v);
 }
Run Code Online (Sandbox Code Playgroud)

EDG/Comeau和MSVC允许代码,而GCC 4.4.4,CLANG和BCC拒绝它是不明确的.

一位C++委员会成员回答了这个问题(最初):

这不是模棱两可的; A(const A&)构造函数优于A(const char*)构造函数.const A&参数直接绑定到转换函数的结果,因此转换序列被认为是用户定义的转换,后跟身份转换(13.3.3.1.4p1).const char*参数是用户定义的转换,后跟资格转换,所以情况更糟.

然后,他跟进了这个.

实际上,我错了.虽然用户定义的转换序列中的第二个转换序列确实是一个决胜局,但仔细观察13.3.3.2p3,倒数第二个子弹,揭示了这个决胜局只适用于两个序列包含相同的情况用户定义的转换序列,在本例中不是这种情况.因为一个构造函数的转换序列使用B ::运算符A()而另一个使用b ::运算符char*(),所以在两个用户定义的转换序列之间没有仲裁器,并且它们是不明确的.

我的问题是这个.

13.3.3.2 p3表明,

除非以下规则之一适用,否则相同形式的两个隐式转换序列是不可区分的转换序列.

根据我的理解,关键字是"以下规则之一".这并不意味着说明"相同转换序列"的子弹会覆盖上述所有转发序列.我会认为"S1的等级优于S2的等级"会适用吗?

Chu*_*dad 4

是的,根据我对第 13.3.3.2 条的最佳解释,预期结果是模糊的

将“B”类型的参数“v”与“A”的任一重载构造函数的参数匹配需要用户定义的转换。两个序列都是 CONVERSION 级别的。

我的解释是以下来自 $13.3.3.2 的报价适用

[...]如果用户定义的转换序列 U1包含相同的用户定义的转换函数或构造函数,并且U1 的第二个标准转换序列优于第二个,则用户定义的转换序列 U1 是比另一个用户定义的转换序列 U2 更好的转换序列U2的标准转换序列。

这两者都调用“B”类中的不同转换函数。因此,我认为第一个条件本身不满足,因此预期结果是模糊的,因为转换序列中的任何一个都比另一个更好。