繁体   English   中英

转换函数在C ++ 14中使用decltype(auto)

[英]Conversion Function with decltype(auto) in C++14

class A {
    public:
        int num;
        A ( int param ) : num( param ) {}
        operator decltype( auto )( ){ return num; }
};

class B {
    public:
        int num;
        A objA;
        B ( int param ) : num( param ), objA( param ) {}
      //operator A( )       { return objA; }         // Works               // #1   
      //operator int( )     { return objA; }         // Works               // #2
      //operator char( )    { return objA; }         // Actually Not Needed // #3
      //operator double( )  { return objA; }         // Actually Not Needed // #4
        operator decltype( auto )( ){ return objA; } // Does NOT Work       // #5
};

int main(){

    A objA( 1 );
    int    x1 =   int( objA );
    char   y1 = (char) objA;
    double z1 =        objA;

    B objB( 2 );
    A objA2     = objB;
    int      x2 = objB;
    char     y2 = objB;
    double   z2 = objB;

    return 0;
}

这段代码既不用clang也不用gcc编译,所以我认为它不正确。 但是,如果我对第5行进行注释并取消注释第1行和第2行,则程序在两个编译器中都能正常工作(不需要第3行和第4行)。

据我所知,在两种情况下都定义了必要的转换序列。 有谁知道为什么这个程序不正确? 我错过了什么?

decltype(auto)将获得您返回类型的确切类型(包括引用和指针)。 对于class A您的转换运算符将返回一个int ,对于class B您将获得它返回class A 我认为你的信念是operator decltype(auto) (){/*...*/}将尝试返回需要转换的类,而实际上你需要一个模板来执行此操作:

class A {
    public:
        int num;
        A ( int param ) : num( param ) {}

        template<class T>
        operator T(){ return static_cast<T>(num); }
};

class B {
    public:
        int num;
        A objA;
        B ( int param ) : num( param ), objA( param ) {}

      template<class T>
      operator T ( ){ return static_cast<T>(objA); }
};

现场演示

请注意, 隐式转换序列只能包含一个用户定义的转换。 然后代码将不适用于int x2 = objB; ; B转换为AA转换为int都是用户定义的转换。

如果在B提供operator int() ,它可以正常工作,因为B可以直接转换为int (还可以使用chardouble ,可以通过标准转换将int转换为。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM