0

次のクラスのカスタムアレイを検討してください

template <typename element, unsigned int size>
class array
{
private:
    element (&data)[size];
public:
    array(element (&reference)[size]):data(reference){}
    array():data(new element [size]){} // This is where my problem arises
};

明らかに、コンストラクターの初期化リストでは、右辺値式(new-expressionが参照型ではなくポインターの右辺値に評価されます。そのため、MSVC(Microsoft Visual Studio 2012 RC)では、要素*から要素(&)[size]への型変換に関するエラーが表示されます。

ただし、右辺値をポインタから参照に変換できれば、コンパイルする必要があると思います。コンストラクターの初期化リストに入れる可能性はありますか?それとも、C ++言語の原則とすべて矛盾しているのでしょうか?私はreinterpret_castを調査しましが、関連すると思われる唯一のルールは

「タイプT1の左辺値式は、別のタイプT2を参照するように変換できます。結果は、元の左辺値と同じオブジェクトを参照するが、タイプが異なる左辺値またはx値になります。」--cppreference.com

これは、変換が左辺値式に適用されることを明確に示しています。

OK、私はあなたが今考えるかもしれないことを知っています-なぜあなたはそのようなクラスのカスタム配列が必要なのですか、そしてなぜあなたは問題のある参照の代わりに単に複合ポインタを使わないのですか?ええと...あなたは常に最良のものを知る前に選択するための異なるアプローチが必要ですよね?

4

2 に答える 2

2

C ++ 11と右辺値の参照についてこれは何ですか?ポインタが指す値への左辺値式を取得するには、単項演算子を使用するだけ*です。それは最初から言語の一部でした。ここで行う必要があるのは、配列の最初の要素へのポインターではなく、配列へのポインターを取得することだけです。

template <typename element, unsigned int size>
class array
{
private:
    element (&data)[size];
public:
    array() : data(*new element[1][size]) { }
    array(element (&reference)[size]) : data(reference) { }
};

Matがコメントで述べたように、ここでのパラメーターなしのコンストラクターは、メモリーが解放されないため、非常に悪い考えです。うまくいけば、動作するコードサンプルがあれば、少し実験して同じ結論に達することができます。

于 2012-07-07T11:02:49.870 に答える
0

このコードでは、R値参照をまったく使用していません。&&r値シンボルの単一の使用法はありません。

編集:

template <typename element, unsigned int size> 
class array 
{ 
private: 
    element (&data)[size]; 
    static element DefaultArrRef[size];
public: 
    //array(element (&reference)[size]):data(reference){} 
    array():data(DefaultArrRef){}
}; 


template <typename element, unsigned int size> 
element array<element,size>::DefaultArrRef[size];
于 2012-07-07T11:15:51.753 に答える