Является ли передача параметров конструктора экземпляром класса? - PullRequest
0 голосов
/ 28 мая 2018

Я столкнулся с этим случаем (упрощенно)
Это компилируется без каких-либо предупреждений о том, как кажется, что данный параметр приведен к экземпляру класса B в конструкторе класса A

class B{
    public:
        B(int _x) { }
        virtual ~B() { }
};

class A{
    public:
        A(const B& source) { }
        virtual ~A() { }
};

int main(){
    new A(1);
    return 0;
}

1.Это считается хорошей практикой?

Я не видел ни одного кода на C ++, который бы давал параметры конструктору при запросе ссылки на экземпляр / const.Это невысказанное правило?

2.В какой степени это возможно / разрешено без и с предупреждениями?

Это не работает, когда прототип функции запрашивает (не const) ссылку.

3.Когда компилятор считает, что это лучше, чем перегруженная функция?

Компилирование следующего примера:

class B
{
    public:
        B(double _x = 0, double _y = 0) { }
        virtual ~B() { }
};

class A
{
    public:
        A(const B& source, int z = 0) {cout << "B class constructor";}
        A(double _x, double _y){cout << "primitive types";}
        virtual ~A() { }
};

int main()
{
    new A(1, 1);
    return 0;
}

Выдает предупреждение (с некоторыми параметрами компилятора):

warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
note: candidate 1: A::A(double, double)
note: candidate 2: A::A(const B&, int)

(Я понимаю, что компилятор конфликтует с int-> double)

Но при удалении параметра int z = 0 из конструктора (const B&, int) предупреждение исчезает (и все равно выводит "primitive types")
Что, на мой взгляд, гораздо более неоднозначно.

Как определяется неопределенность?

1 Ответ

0 голосов
/ 28 мая 2018
  1. Это считается хорошей практикой?

Я не видел ни одного кода в C ++, который выдает параметры конструктора при запросе ссылки на экземпляр / const.Это невысказанное правило?

«Давать параметры конструктора» не имеет смысла.Здесь происходит то, что объект const B создается из double через конструктор, который вы предоставили для этой цели.Ничего более загадочного, чем это.На самом деле это простая операция приведения типов, и компилятор C ++ всегда будет учитывать одностадийное приведение типов, если оно доступно при передаче параметра или возвращаемого значения.

В какой степени это возможно / разрешено без и с предупреждениями?

В той степени, в которой это возможно за один шаг без двусмысленности.

Это не работает, когда прототип функции запрашивает (не константную) ссылку.

Это потому, что компилятор не будет создавать неконстантный временный объект по правилам C ++.

Когда компилятор считает, что это лучше, чем перегруженная функция?... что в моем варианте гораздо более неоднозначно

Это не так.

Как разрешается неоднозначность?

Нет никакой двусмысленности, чтобы решить.В C ++ нет правила, согласно которому следует пытаться создать один объект const B из двух или более параметров.

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