(Запрос .)
Учитывая N3290, §7.1.6.2p4, где элементы списка пронумерованы, но пронумерованы здесь для нашего удобства:
Тип, обозначенный как decltype (e), определяется следующим образом:
- Если e - это неравномерное id-выражение или unparenthesized class member access (5.2.5), decltype (e) - это тип объекта, названного e. Если такой объект отсутствует или если e называет набор перегруженных функций, программа плохо сформирована;
- в противном случае, если e является значением x, decltype (e) является T & &, где T - тип e;
- в противном случае, если e является lvalue, decltype (e) является T &, где T - тип e;
- иначе, decltype (e) - тип e.
Каков тип, заданный decltype (0 + 0)?
Пункт 1 не применяется, 2 может, но если нет, то 3 не применяется, а 4 - результатом. Итак, что такое xvalue и равно 0 + 0 xvalue?
§3.10p1:
Значение xvalue (значение "eXpiring" ) также относится к объекту, обычно ближе к концу его жизненного цикла (так что его ресурсы могут быть перемещены, например). Значение x является результатом определенных видов выражений с использованием ссылок rvalue (8.3.2).
Я ничего не вижу в §8.3.2, что было бы полезно здесь, но я знаю, что "0 + 0" не включает никаких rvalue-ссылок. Литерал 0 является значением prvalue, которое является "значением r, которое не является значением x" (§3.10p1). Я считаю, что "0 + 0" также является prvalue. Если это верно, "decltype (0 + 0)" будет int (не int &).
Я что-то пропустил в своей интерпретации? Является ли этот код хорошо сформированным?
decltype(0 + 0) x; // Not initialized.
Код компилируется на GCC 4.7.0 20110427 и Clang 2.9 (ствол 126116). Он не был бы корректно сформирован, если в определении decltype указан int && типа, например.