$4.2/1 - 「「N T の配列」型または「T の境界が不明な配列」の左辺値または右辺値は、「T へのポインター」型の右辺値に変換できます。結果は、配列の最初の要素へのポインタです。」
初期化/宣言時以外に配列型の右辺値を取得する方法がわかりません。
$4.2/1 - 「「N T の配列」型または「T の境界が不明な配列」の左辺値または右辺値は、「T へのポインター」型の右辺値に変換できます。結果は、配列の最初の要素へのポインタです。」
初期化/宣言時以外に配列型の右辺値を取得する方法がわかりません。
このコンテキストで「初期化/宣言」が何を指しているのかわかりません。以下では、配列は prvalue です。
template<typename T> using alias = T;
int main() { return alias<int[]>{1, 2, 3}[0]; }
decltype(alias<int[]>{1, 2, 3})
これは type を持つことで確認できますint[3]
。この方法で配列をオンザフライで作成することは、当初は機能することを意図していませんでしたが、一様な初期化に関する関連作業によって作業草案に滑り込みました。C++0x ワーキング ドラフトのいくつかのパラグラフでは、一時配列のオンザフライ作成の特殊なケースが許可されていないが、他のパラグラフでは許可されていることに気付いたとき、私は C++ 委員会に欠陥レポートを送りました。 GCC の部分的に機能する実装の一部が、これを完全にサポートすることを決定しました。
配列型の右辺値を取得することはできません。配列は左辺値のみにすることができ、左辺値で使用される場合は常に、最初の要素へのポインターに減衰します。
int array[10];
int * p = array; // [1]
array
[1]の式は、型の右辺値に変換される型の左辺値です。int (&)[10]
つまり、N == 10 T == intint *p
の右辺値配列は、T==intへの型ポインターの左辺値に変換されます。
これは Array Rvalue を実証するチャンスでしょうか?
int main(){
int buf[10][10];
int (*p)[10] = buf;
int (*p2)[10] = p; // LValue to Rvalue conversion of Array type 'p'
}