Массив и Rvalue

$4.2/1 - "Значение l или значение типа" массив из N T "или" массив неизвестных границ T "может быть преобразовано в значение типа" указатель на T ". Результатом является указатель на первый элемент массив ".

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

4 ответа

Я не уверен, что вы называете "инициализация / объявление" в этом контексте. В следующем массив является 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 решили полностью поддержать это.

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

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

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

Получить правильное ссылочное значение массива очень легко, поскольку к его членам будет добавлено свойство ссылки на класс.

      struct s {
    int arr[5];
};
using array_right_reference = decltype((s().arr));
static_assert(std::is_same<array_right_reference, int (&&)[5]>::value, "");

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

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

 int (*p)[10] = buf;

 int (*p2)[10] = p;      // LValue to Rvalue conversion of Array type 'p'
}
Другие вопросы по тегам