У меня вопрос, если функции преобразования (пользовательские преобразования) имеют приоритет над прямыми вызовами.
Предположим, вы перегружаете функцию:
void display_widget( double f );
void display_widget( Widget a );
У меня вопрос, который имеет более высокийприоритет:
- функция преобразования (пользовательское приведение), принимающая
Widget
и возвращающая double
- Функция
display_widget
, имеющая double
в своем параметреlist
#include <iostream>
class Widget {
public:
Widget() : d{ 0.0 } {};
double get_d() { return d; }
operator double() {
std::cout << "operator double() was called" << std::endl;
return d;
}
private:
double d;
};
void display_widget( double widget ) {
std::cout << "The double is: " << widget << std::endl;
}
void display_widget( Widget widget ) {
std::cout << "The Widget is: " << widget.get_d() << std::endl;
}
int main(int argc, char* argv[]) {
Widget a{ 79.99 };
display_widget(a);
return 0;
}
Обратите внимание, что у нас есть две функции display_widget
, одна из которых принимает Widget
, а другая принимает double
. Рассмотрим следующую строку внутри main
:
display_widget(a);
Какую из следующих последовательностей операторов печати мы увидим?
+----------------------+------------------------------+
| option 1 | option 2 |
+----------------------+------------------------------+
| The Widget is: 79.99 | operator double() was called |
| | The double is: 79.99 |
+----------------------+------------------------------+