[英]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
转换为A
, A
转换为int
都是用户定义的转换。
如果在B
提供operator int()
,它可以正常工作,因为B
可以直接转换为int
。 (还可以使用char
和double
,可以通过标准转换将int
转换为。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.