#c #gcc #compilation
#c #gcc #Сборник
Вопрос:
В более поздних версиях GCC. Как можно (если можно) устранить неоднозначность ‘0’ или ‘NULL’, когда у вас есть несколько конструкторов, которые принимают ссылки или указатели?
ie:
class XXX
{
public:
XXX(const XXX amp;tocopy);
XXX(const char *fromAString);
XXX(const AnotherThing *otherThing);
operator=(const XXX amp;tocopy);
operator=(const char *fromAString);
operator=(const AnotherThing *otherThing);
};
// nice not to have to cast when setting to NULL for
// things like smart pointers and strings. Or items that can be initialized from
// several types of objects and setting to null means "clear"
XXX anXXX = NULL;
anXXX = 0;
// In MSC one can have an
// XXX(const int amp;nullItem) { DEBUG_ASSERT(!nullItem); setnull(); }
// and the overloads would be disambiguated. GCC will cause a const int to conflict
// with pointer types.
Ответ №1:
C имеет систему типов, поэтому переменные имеют типы, которые используются компилятором для выполнения разрешения перегрузки:
const char * p = 0;
const AnotherThing * q = 0;
XXX a(p), b(q); // uses the respective constructors for the static type of p, q
Если перегрузка неоднозначна, потому что вы не используете один из требуемых типов указателей, вы получите сообщение об ошибке:
XXX c(0); // error: ambiguous
Комментарии:
1. Также не используйте
const char*
и предпочитайте ссылки на указатели. И, вероятно, сделать эти ctors явными.2. Согласен, что лучше всего объявлять конструкторы с одним аргументом
explicit
.3. Вызов f(10) для f(const vectoramp; x) был бы довольно аккуратным, хотя =) sry.
4. это означает, что вы не можете создать класс указателя варианта, для которого можно установить значение «NULL», не приводя значение NULL. Было бы неплохо иметь «NullType», чтобы можно было создать перегрузку, которой может быть присвоен только ‘const int 0’ и не конфликтовать с явными типами. MSC разрешит const int по типам указателей и ссылок, GCC не будет.
5. @peterk: Я не понимаю, как это может быть полезно. Что бы сделал этот предполагаемый нулевой конструктор? Почему бы вам не реализовать это как конструктор по умолчанию?