【发布时间】:2010-11-24 05:30:16
【问题描述】:
struct A
{
A(const A& src);
A(const char* src);
};
struct B
{
operator A();
operator char*();
};
void test()
{
B v;
A s(v);
}
EDG/Comeau 和 MSVC 允许代码,而 GCC 4.4.4、CLANG 和 BCC 拒绝它是模棱两可的。
一位 C++ 委员会成员(最初)这样回答:
这不是模棱两可的; A(const A&) 构造函数比 A(const char*) 构造函数。常量 A& 参数直接绑定到结果 的转换函数,所以 转换序列被认为是 是一个用户定义的转换跟随 通过身份转换 (13.3.3.1.4p1)。常量字符* 参数是用户定义的转换 其次是资格 转换,所以更糟。
然后,他跟进了。
其实我错了。虽然它是 确实,第二次转换 用户定义转换中的序列 序列是决胜局,看起来更多 在 13.3.3.2p3 时, 倒数第二个子弹,表明这 决胜局仅适用于两个 序列包含相同的 用户定义的转换序列,以及 在本例中并非如此。 因为一个构造函数的转换 序列使用 B::operator A() 和 其他用途 b::operator char*(), 两者之间没有决胜局 用户定义的转换序列和 它们是模棱两可的。
我的问题是这个。
13.3.3.2 p3 指出,
两个隐式转换序列 相同的形式是无法区分的 转换序列,除非其中之一 以下规则适用。
据我了解,关键字是“以下规则之一”。 这并不意味着声明“相同转换顺序”的项目符号 覆盖以上所有内容。我会认为“S1的排名更好 比 S2 的等级更适用吗?
【问题讨论】:
-
很好地证明了 C++ 有点太复杂了......
-
既然你有一个 c++ 社区成员联系人,你不应该让他提出问题吗? (或检查是否在open-std.org/jtc1/sc22/wg21/docs/cwg_active.html 提交)
-
我不是说有问题,我实际上是在尝试理解标准。
-
有趣的是知道 EDG 和 MSVC 允许哪种转换。但这是我不喜欢隐式转换的原因之一,如果我需要转换,我会要求的,谢谢。
-
显式 = 好,隐式 = 坏