результаты в типе
казаноответ.)
Учитывая 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 &&.