Должен ли decltype (1, t) быть ссылкой на l-значение? (Составители не согласны) - PullRequest
4 голосов
/ 18 февраля 2020

Минимальный код:

int t;
static_assert(is_same_v<decltype(1, t), int&>);

Выше компилируется в g ++ и clang ++, но не работает в MSV C. MSV C, кажется, думает:

int t;
static_assert(is_same_v<decltype(1, t), int>);

Какой стандарт указан в стандарте? Я очень полагаюсь на эту модель для SFINAE.

1 Ответ

2 голосов
/ 18 февраля 2020

G cc и Clang верны. 1, t is выражение запятой ,

Тип, значение и категория значения результата выражения с запятой в точности соответствуют типу, значению и категории значения второго операнд, E2.

2-й операнд, то есть t является lvalue, тогда decltype приведет к T&.

Если аргумент является любым другим выражением типа T и

  • , если категория значений выражения lvalue, тогда decltype дает T&;

По стандарту [expr.comma] / 1 :

(выделено мной)

Тип и значение результата - это тип и значение правого операнда; результат имеет ту же категорию значений, что и его правый операнд ,

и [dcl.type.decltype] /1.5

в противном случае, если e является lvalue, decltype(e) является T&, где T является типом e;

Кстати: я пробовал с MSV C здесь и получили тот же результат с G cc и Clang.

...