результаты в типе

казаноответ.)

Учитывая 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 &&.

Ответы на вопрос(5)

Ваш ответ на вопрос