Массив и 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'
}