С++ 03 §4.2 № 1:
Lvalue или rvalue типа "массив из N T" или "массив неизвестной границы T" могут быть преобразованы в rvalue типа "указатель на T". Результатом является указатель на первый элемент массива.
То, что в течение долгого времени меня смутило в этом заявлении, заключалось в том, что я не совсем понял, что означало бы значение типа массива. То есть, я не мог придумать выражение, тип которого был массивом, а результатом было значение rvalue. Я прочитал этот поток, который в основном задает один и тот же вопрос, и принятый ответ "нет, нет значения типа массива". Я думаю, что у меня просто есть противоречие с этим.
С++ 03 §5.2.5 N ° 4: (речь идет о выражении E1.E2)
Если E2 - нестатический элемент данных, а тип E1 - "cq1 vq1 X", а тип E2 - "cq2 vq2 T", выражение обозначает именованный элемент объекта, обозначенный первым выражением. Если E1 является lvalue, то E1.E2 является lvalue.
Я предполагаю, что в противном случае это rvalue (если E2 не является ссылкой, этот случай покрывается §5.2.5 N°3
) и поэтому...
struct A
{
int a[4];
};
A f()
{
A a;
return a;
}
int main()
{
f().a; //I think this is an rvalue of array type...
}
Я вижу два варианта:
Вариант 1: Я прав, ура, гей, круто. В этом случае возникает вопрос: существуют ли другие примеры?
Вариант 2: Я ошибаюсь, в этом случае возникает вопрос: является ли это дефектом стандарта?
Я не знаю около 1, но я действительно сомневаюсь в 2, потому что, когда они говорят о конверсиях между указателями, они упоминают только lvalues типов функций (очевидно, учитывая, что таких значений нет). Поэтому, скорее всего, они думали о избыточных значениях типов массивов.
Итак, в основном, мой вопрос заключается в том, действительно ли я придумал пример значения rvalue типа массива, а если нет, укажите действующий, который, как я полагаю, существует.