C ++ 03 §4.2 N ° 1:
Значение l или значение типа «массив NT» или «массив неизвестной границы T» может быть преобразовано в значение типа «указатель на T». Результатом является указатель на первый элемент массива.
Что в этом утверждении долгое время сбивало меня с толку, так это то, что я не совсем понимал, что будет означать значение типа массива. То есть я не мог придумать выражение, тип которого был массивом, а результат - значением. Я прочитал этот поток, который в основном задает тот же вопрос, и принятый ответ "нет, нет значения типа массива". Я думаю, у меня просто может быть противоречие с этим.
C ++ 03 §5.2.5 N ° 4: (соответствует выражению E1.E2)
Если E2 является нестатическим элементом данных, а тип E1 - «cq1 vq1 X», а тип E2 - «cq2 vq2 T», выражение обозначает именованный член объекта, обозначенный первым выражение. Если E1 является lvalue, то E1.E2 является lvalue.
Я предполагаю, что в противном случае это r-значение (при условии, что 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, потому что, когда они говорят о преобразованиях функций в указатели, они упоминают только l-значения типов функций (очевидно, понимая, что таких значений не существует). Поэтому вполне вероятно, что они подумали о значениях типов массивов.
Итак, в основном мой вопрос заключается в том, придумал ли я пример значения rvalue типа массива, и если нет, укажите правильный, который, я убежден, существует.