Если у вас есть две функции с одним и тем же именем (перегружены) и имеется конструктор преобразования, будет ли вызываться конструктор преобразования? - PullRequest
1 голос
/ 29 сентября 2019

Предположим, вы перегружаете функцию:

void display_widget( float f );    
void display_widget( Apple a );

Мой вопрос имеет более высокий приоритет:

  1. конструктор преобразования, создающий Apple из float
  2. Перегруженная функция, имеющая float в своем списке параметров
    #include <iostream>    
    class Apple
    {
        public:
            Apple() : f{ 0.0 } {};
            float get_f() { return f; }

            Apple(float _f) : f{ _f } {};
            operator float()  { return f; }

        private:
            float f;
    };    

    void display_widget( float f )
    {
        std::cout << "The float is: " << f << std::endl;
    }    

    void display_widget( Apple a ) 
    {
        std::cout << "The Apple is: " << a.get_f() << std::endl;
    }

    int main(int argc, char* argv[])
    {      
        display_widget(49.95);        
        return 0;
    }       

Обратите внимание, что у нас есть две display_widget функции, одна из которых принимает Apple, а другая принимаетfloat

Рассмотрим следующую строку внутри main:

display_widget(49.95);

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

+---------------------------------+--------------------------------+
|            option 1             |            option 2            |
+---------------------------------+--------------------------------+
| display_widget( float f );      | a = Apple( float _f );         |
|                                 | display_widget( Apple a );     |
+---------------------------------+--------------------------------+

1 Ответ

2 голосов
/ 29 сентября 2019
Будет выбрано

display_widget( float f ).

Учитывая display_widget(49.95);, для вызова display_widget(float) последовательность неявного преобразования содержит только одно стандартное преобразование (от double до float).Для вызова display_widget(Apple) последовательность преобразования содержит одно стандартное преобразование (от double до float) и одно пользовательское преобразование (от float до Apple), а затем квалифицируется как определяемое пользователемпоследовательность преобразования.Стандартная последовательность преобразования имеет более высокое ранжирование в разрешении перегрузки .

Стандартная последовательность преобразования всегда лучше, чем определяемая пользователем последовательность преобразования или последовательность преобразования многоточия.

...