首页 > 解决方案 > 如果你有两个全局函数,一个用于 `Widget`,另一个用于 `double`,而 `Widget` 类定义了 cast-to-double,会发生什么?

问题描述

我的问题是转换函数(用户定义的强制转换)是否优先于直接调用。

假设你重载了一个函数:

void display_widget( double f );    
void display_widget( Widget a );

我的问题是,它具有更高的优先级:

  1. 一个转换函数(用户定义的转换)接受一个Widget并返回一个double
  2. 在其参数列表中 display_widget具有 a的函数double
#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         |
+----------------------+------------------------------+   

标签: c++type-conversionoperator-overloadingimplicit-conversionoverload-resolution

解决方案


推荐阅读