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