2015-12-26 5 views
2

Так, чтобы изучить больше о процессе разрешения перегрузки Я читал эту статью: http://accu.org/index.php/journals/268Почему этот вызов неоднозначен?

Особенность «Заказ определяемых пользователем преобразования последовательностей» раздела имеет следующий пример:

struct A; 
struct B { 
    B(A const&); 
}; 

struct A { 
    operator B() const; 
    operator int() const; 
}; 
void func(B); 
void func(int); 

func(A()); 

Первоначально я думал, что вызов является неоднозначным, поскольку из следующих операторов преобразования в структуры A

operator B() const; //-> A::operator B(const A&) 
    operator int() const; //-> A::operator int(const A&) 

Тогда они объяснили так:

Звонок неоднозначен, однако параметр B имеет неоднозначную последовательность преобразования , и если функция, имеющая этот параметр, была , то вызов был бы неоднозначным. Это связано с тем, что будет выбирать только одну функцию.

Который полностью пошел верхней части моей головы, так что я должен встать и прочитать ее еще раз, но до сих пор она ускользала от меня усмехается

Я действительно был бы признателен, если можно было бы объяснить порядок события и что выше цитата из статьи, означающей простой термин, пожалуйста :) Большое спасибо :)

+0

Цитата подтверждает ваше отражение, я не знаю, где проблема. – LogicStuff

ответ

2

Это попытка проиллюстрировать пункт, сделанный в предыдущем абзаце в статье.

Вы не можете успешно передать A в void func(B) из-за неоднозначной последовательности преобразований, которую вы идентифицировали. Но для целей разрешения перегрузки перегрузка по-прежнему считается жизнеспособной.

Если вместо этого он был удален из жизнеспособного набора, тогда звонок func однозначно вызвал бы void func(int), потому что другого выбора не было. Вероятно, это не так.

+0

Большое спасибо за прояснение вещей и за ваше время, чтобы помочь :) –

+0

еще одна вещь, чтобы подтвердить сэр, вы сказали -> «Вы никогда не сможете успешно передать' A' в 'void func (B)' из-за неоднозначную последовательность преобразований, которую вы идентифицировали », но это означает, что разрешение перегрузки неоднозначно для оператора A :: B (const A &)' и 'B :: B (const A &)' или разрешения перегрузки сбиты, чтобы выбрать два оператора из struct 'A', которые являются ->' A :: operator int (const A &) 'и' A :: operator int (const A &) '. Еще раз спасибо :) –

+0

Неоднозначность, о которой я думал, заключается в преобразовании A в B через конструктор B или оператор преобразования A. (Кстати, я бы предпочел, чтобы вы назвали меня Аланом, чем сэром.) –

Смежные вопросы