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)。
据我所知,两种场景都定义了必要的转换顺序。有谁知道为什么这个程序不正确?我错过了什么?
请注意,implicit conversion sequence 只能包含一个用户定义的转换。那么该代码将不适用于 int x2 = objB;
; B
转A
和A
转int
都是用户自定义的转换。
如果您在 B
中提供 operator int()
,它可以正常工作,因为 B
可以直接转换为 int
。 (也适用于 char
和 double
,int
可以通过标准转换转换为。)
decltype(auto)
将获得 您正在 returning 类型的确切类型(包括引用和指针)。对于 class A
,您的转换运算符将 return 变成 int
,而对于 class B
,您将得到 return 和 class A
。我认为您认为 operator decltype(auto) (){/*...*/}
会尝试 return 需要转换的 class,而实际上您需要一个模板才能这样做:
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); }
};
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)。
据我所知,两种场景都定义了必要的转换顺序。有谁知道为什么这个程序不正确?我错过了什么?
请注意,implicit conversion sequence 只能包含一个用户定义的转换。那么该代码将不适用于 int x2 = objB;
; B
转A
和A
转int
都是用户自定义的转换。
如果您在 B
中提供 operator int()
,它可以正常工作,因为 B
可以直接转换为 int
。 (也适用于 char
和 double
,int
可以通过标准转换转换为。)
decltype(auto)
将获得 您正在 returning 类型的确切类型(包括引用和指针)。对于 class A
,您的转换运算符将 return 变成 int
,而对于 class B
,您将得到 return 和 class A
。我认为您认为 operator decltype(auto) (){/*...*/}
会尝试 return 需要转换的 class,而实际上您需要一个模板才能这样做:
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); }
};