Неопределенность между перегруженными конструкторами - PullRequest
5 голосов
/ 15 сентября 2011

Может кто-нибудь объяснить мне, почему в следующем коде я получаю неоднозначный вызов перегруженных конструкторов в Foo, если я пытаюсь создать экземпляр MyFooC?Мое предположение состояло в том, что целое число, используемое в качестве параметра конструктора, было бы преобразовано в целое число без знака и разрешено, но это, очевидно, неверно.

Ответы [ 2 ]

10 голосов
/ 15 сентября 2011

int может быть преобразовано как в double, так и в unsigned; оба считаются «расширяющимися» конверсиями и имеют равный ранг. В целом Правило, каждый раз, когда вы перегружаете, и одна из перегрузок является интегральной типа, это хорошая идея перегрузить на int, чтобы быть уверенным в получать то, что вы хотите, и избегать двусмысленностей, когда кто-то пытается передать интегральную константу.

Кстати: хотя в контексте ясно, что вы имеете в виду, в стандарте C ++ «продвижение» имеет очень точное значение и не включает преобразование int в unsigned int.

0 голосов
/ 15 сентября 2011

Я предполагаю, что проблема в том, что int можно так же легко преобразовать в double. Я не знаю никаких спецификаций в C ++, которые бы определяли порядок предпочтений для неявного приведения типов, поэтому, когда компилятор видит int, который может перейти в double или unsigned int, он рассматривает вызов как неоднозначный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...