別の関数の末尾の戻り値の型で演算子の戻り値の型を再利用しようとしましたが、残念ながらclangはそれを受け入れませんでした
struct A {
int operator[](int);
auto at(int i) -> decltype((*this)[i]);
};
Clang は、私のクラスには operator[] がないと言っています。Gcc は私のコードを受け入れました。私のコードは実際に無効ですか?
別の関数の末尾の戻り値の型で演算子の戻り値の型を再利用しようとしましたが、残念ながらclangはそれを受け入れませんでした
struct A {
int operator[](int);
auto at(int i) -> decltype((*this)[i]);
};
Clang は、私のクラスには operator[] がないと言っています。Gcc は私のコードを受け入れました。私のコードは実際に無効ですか?
次のコードが
struct A {
int operator[](int);
auto at(int i) -> decltype( this-> operator[]( i ) );
};
CLangでもコンパイル - http://liveworkspace.org/code/2Myghk $6
13.3.1.2p3 (最初の箇条書き) のため、clang は正しいと言えます。
@
cv 非修飾バージョンが である型のオペランドを持つ単項演算子、および cv 非修飾バージョンがである型の左オペランドと cv 非修飾バージョンがである型の右オペランドをT1
持つ二項演算子の場合、3候補関数、指定されたメンバー候補、非メンバー候補、および組み込み候補のセットは、次のように構築されます。@
T1
T2
- が完全なクラス型の場合
T1
、メンバー候補のセットはT1::operator@
(13.3.1.1.1) の修飾ルックアップの結果です。それ以外の場合、メンバー候補のセットは空です。
(強調は@seheによって追加されました)
私とステファンのコメントを繰り返します:
これは clang の明らかなバグです。クラスには明らかにoperator[](int)
.
使用しているコードが有効であるかどうかdecltype()
は、微妙に異なる問題です (有効であると言えますが、それを証明することはできません)。