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は実際には必要ありません)。C++でdecltype(auto)を使用する変換関数14
私が知る限り、必要な変換シーケンスは両方のシナリオで定義されています。なぜ誰がこのプログラムが正しくないのか分かりますか?私は何が欠けていますか?
、私はdidnの:私はあなたの信念は、実際にあなたがそうするようにテンプレートを必要とするとき
operator decltype(auto)(){/*...*/}
は、変換が必要とされているクラスを返すようにしようとすることだと思いますそのルールについて知りません。しかし、2番目のケースでは、Bがintに直接変換できると言うと、変換可能関数がAを返すため、2つのユーザー定義変換もあります(Bはintに直接変換できません)。 '演算子int(){戻り値objA; } '(これは最初のユーザ定義の変換です)、クラスAのオブジェクトを返します。これは、他のユーザ定義変換でintに変換する必要があります。' operator decltype(auto)(){return num; } '。それは正しいのではないですか?ご協力いただきありがとうございます。 –@JLはい、 'return objA;'に対して、 'objA'は' A'で定義された変換演算子によって 'int'に変換されます。しかしそれは別の変換シーケンスです。元の変換シーケンス(すなわち、 'B'から' int')は 'B :: operator int()'によって終了し、変換を行うことができます。それがどのように実装されるかは別の問題です。 – songyuanyao
OK、あなたの言うことを理解していますが、他のケースでも同じことを言うことができませんでしたか?私は答えがノーだと思うので、それが間違っています。したがって、 'operator decltype(auto)(){return objA;}を使用します。 }}は、両方のユーザ定義コンバージョンが同じシーケンスにあることを意味しますが、他のケース( 'operator int(){return objA;}')には2つの異なる変換シーケンスがあります。私は完全に理解していない1つのケースでは、同じ変換シーケンスであり、他のケースでは2つの異なる変換シーケンスと見なされますが、正解のように聞こえる。もう一度あなたの助けをありがとう:) –