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