FWIW, я копирую свой ответ, который я передал в usenet копию этого вопроса:
Привет всем,
Я очень запутался в стандарте n3225 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; //
недвусмысленный
&D::i
имеет тип int B1::*
и однозначно относится к элементу данных i
из
B1
. Если вы разыменовываете его с помощью D
объекта или если вы присваиваете ему int
D::*
, вы получите двусмысленность при необходимости.
Visual C ++, Gcc и CLang говорят, что это неоднозначный доступ к D :: i!
Ни один из этих компиляторов пока не реализует 10.2.
Формулировка, похоже, связана с основной проблемой # 39
http://www.open -std.org / jtc1 / sc22 / wg21 / docs / cwg_defects.html # 39 и
окончательное предложение здесь:
http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 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?
Новые правила поиска, основанные на алгоритме, отделяют проблемы времени выполнения (поиск
уникальный объект) с точки зрения времени компиляции / поиска (поиск объявления, которое
имя относится к).
В новой редакции правильно сформулировано следующее:
struct Z { int z; };
struct X : Z { };
struct Y : Z { };
struct A : X, Y { };
struct B : A {
using A::z;
};
Объявление using A::x;
вводит имя члена в B, которое относится к
декларация Z::z
. В декларативном контексте это прекрасно.
ошибка возникает только при доступе к B::z
в качестве выражения доступа члена
(5.2.5).
Не расстраивайтесь из-за того, что ошиблись в случае указателя на член. В прошлом я тоже это делал , и соответствующий отчет о проблеме фактически превратил его в черновик C ++ 0x. К счастью, изменили его обратно , когда заметили, что изменение было неправильным.