我对标准 10.2/13 很困惑,
[注意:即使名称查找的结果是明确的,使用在多个子对象中找到的名称可能仍然是不明确的(4.11、5.2.5、5.3.1、11.2)。-结束注释] [示例:
struct B1 {
void f();
static void f(int);
int i;
};
struct B2 {
void f(double);
};
struct I1: B1 { };
struct I2: B1 { };
struct D: I1, I2, B2 {
using B1::f;
using B2::f;
void g() {
f(); // Ambiguous conversion of this
f(0); // Unambiguous (static)
f(0.0); // Unambiguous (only one B2)
int B1::* mpB1 = &D::i; // Unambiguous
int D::* mpD = &D::i; // Ambiguous conversion
}
};
我不明白为什么这是明确的 int B1::* mpB1 = &D::i; // 明确的
Visual C++、Gcc 和 CLang 都说它是对 D::i 的模棱两可的访问!
措辞似乎与核心问题 #39 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#39有关,最终提案在这里:http://www .open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1626.pdf
我现在发现新的基于算法的措辞 (10.2/3-10.2/6) 更加令人困惑,因为 10.2/9、10.2/10、10.2/11 和 10.2/13 中的注释都没有完全符合 10.2/ 3-10.2/6。我可以将 10.2/9-10.2/11 作为例外,但我对 10.2/13 尤其感到困惑。我不知道 10.2/13 的意图。
10.2/13中的例子应该如何按照10.2/3-10.2/6查找?10.2/13的意图是什么,即10.2/13被认为是10.2/3-10.2/6的例外是什么情况?
请给我一些提示。非常感谢你。
经过一番思考,我认为 10.2/13 的意图对我来说更清楚了。
int B1::* mpB1 = &D::i; // 明确的
这应该是明确的,当前的编译器对此是错误的。这是明确的,因为指向类成员初始化的指针不涉及访问对象。
int D::* mpD = &D::i; // 模糊转换
这实际上意味着当从 int B1::*mpB1 转换为 int D::*mpD 时,由于基类不明确,转换是不明确的。