Я столкнулся с этим случаем (упрощенно)
Это компилируется без каких-либо предупреждений о том, как кажется, что данный параметр приведен к экземпляру класса 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
")
Что, на мой взгляд, гораздо более неоднозначно.
Как определяется неопределенность?