4

CodeGearRADStudioでdecltypeを使用していくつかのコードに取り組んでいます。私は素朴な解決策を試しましたが、これはこれと同じように見えます:

int main(int, char**) {
    int i;
    int &ir = i;
    decltype((ir)) ir_clone = ir;
}

もちろん、これはコンパイルに失敗します:内部コンパイラエラー。そのコードには特に問題はなく、参照式に関するコンパイラのバグがあるのではないかと思います。(ちなみに、g ++はコードに問題がなく、正常にコンパイルされます。)ただし、プラットフォームはネゴシエートできないため、問題の解決には役立ちません。

上記の場合、私は

    decltype(ir) ir_clone = ir; /* No extra parens */

コンパイルされ、期待どおりに機能します。ただし、環境から定数を正しく計算できないため、問題はそれだけではありません。特に:

struct S { int i; } s;
const S* p = &s;
decltype(p->i)   i0 = s.i; /* i0 is an int */
decltype((p->i)) i1 = s.i; /* i1 is a const int& */

引数を式にするためにparensを使用しないと、必要な引数の一貫性が失われます。

私が使用できるもう1つのツールは、次のような単純なテンプレートです。

template<class T> struct unref     { typedef T type; }
template<class T> struct unref<T&> { typedef T type; }

これにより、を使用して、型の参照部分を取り除くことができますunref<int&>::type

私が理解できないように見えるのは、これらすべてのツールを組み合わせて、必要なタイプの式を成功させる方法です。必要なことの1つとして、「foreach」を実行する一般化されたマクロに取り組んでいます。(はい、Boostの方が優れていることはわかっています。)次のシナリオを処理する必要があります。

(vector<int>) vi          => vector<int>
(vector<int>&)vir         => vector<int>
(const vector<int>) cvi   => const vector<int>
(const vector<int>&)cvir  => const vector<int>
(const P*) cp->vi         => const vector<int>
(P*) p->vi                => vector<int>

これまでのところ、私の単純な試みは失敗します:

unref<decltype(cp->vi)>   /* is vector<int>, not what I need. */
unref<decltype((cp->vi))> /* is const vector<int>, which is right. */

unref<decltype(vir)>      /* is vector<int>, which is right. */
unref<decltype((vir))>    /* Internal Compiler Error, which is a headache. */

私を正しい軌道に乗せるためのアイデアはありますか?うまくいけば、私が見逃している単純なものがあります。たぶん私は間違った角度から問題を攻撃しています。

4

2 に答える 2

2

次のように、同じタイプになる別のより複雑な式を作成してみてください。

decltype((void(), ir))

なぜそれが修正されるのかはわかりませんが、別の式でうまくいく場合があります。

于 2011-02-11T20:14:56.273 に答える
2

std :: remove_referenceを使用できます(http://en.cppreference.com/w/cpp/types/remove_referenceを参照)。

于 2016-06-20T10:28:40.973 に答える