Массив и Rvalue - PullRequest
       58

Массив и Rvalue

9 голосов
/ 07 сентября 2010

$ 4.2 / 1 - "lvalue или rvalue типа «Массив из N T» или «массив неизвестных» граница T ”может быть преобразована в Значение типа «указатель на T». результат - указатель на первый элемент массива. "

Я не уверен, как мы можем получить значение типа массива, отличное от инициализации / объявления?

Ответы [ 3 ]

14 голосов
/ 04 февраля 2012

Я не уверен, что вы подразумеваете под "инициализацией / объявлением" в этом контексте.Далее массив является prvalue

template<typename T> using alias = T;

int main() { return alias<int[]>{1, 2, 3}[0]; }

. Это можно проверить с помощью decltype(alias<int[]>{1, 2, 3}), имеющего тип int[3].Создание массивов таким образом на лету изначально не предназначалось для работы, но было включено в рабочий проект в связи с соответствующей работой по равномерной инициализации.Когда я понял, что некоторые параграфы в рабочем проекте C ++ 0x запрещают какой-то особый случай создания временных массивов на лету, тогда как другие параграфы позволяют это, я отправил отчет о дефектах в комитет C ++, который затемчастично работающей реализации GCC решили полностью поддержать это.

0 голосов
/ 07 сентября 2010

Будет ли у вас шанс продемонстрировать Array Rvalue?

int main(){
 int buf[10][10];

 int (*p)[10] = buf;

 int (*p2)[10] = p;      // LValue to Rvalue conversion of Array type 'p'
}
0 голосов
/ 07 сентября 2010

Вы не можете получить значение типа массива. Массивы могут быть только lvalue, и всякий раз, когда они используются в lvalue, они распадаются на указатель на первый элемент.

int array[10];
int * p = array; // [1]

Выражение array в [1] представляет собой lvalue типа int (&)[10], которое преобразуется в rvalue типа int *p, то есть массив rvalue из N == 10 T == int преобразуется в lvalue типа указатель на T == int .

...