Как decltype должен работать с оператором, - PullRequest
2 голосов
/ 29 января 2011

decltype должен давать тип своего параметра.Предполагается, что выражение запятой имеет тип своего правого операнда.В приведенном ниже примере все, кроме c2, ложно при компиляции с VS2010.Когда дело доходит до c1, это странно для меня, но явно соответствует стандарту, в то время как для c4 и c5 я не уверен ... это правильно, или это ошибка компилятора?К сожалению, мой реальный код полагался на is_reference, чтобы вернуть true по крайней мере для c4.

Две последние строки функции компилируются, как и ожидалось, что показывает, что реальная оценка выражения запятой работает.

#include <type_traits>

void comma()
{
 int str = 1;

 bool c1 = std::is_reference<decltype(str)>::value;
 bool c2 = std::is_reference<decltype((str))>::value;
 bool c3 = std::is_reference<decltype((str, str))>::value;
 bool c4 = std::is_reference<decltype((str, str))>::value;
 bool c5 = std::is_reference<decltype((str, (str)))>::value;

 int& s2 = (1, str);
 s2 = 2;
}

1 Ответ

4 голосов
/ 29 января 2011

Насколько я понимаю, вы правы, что decltype((str, str)) и decltype((str, (str))) должны оба обозначать int& как выражение , которое имеет оператор запятой и должно иметь то же значение и категорию значений второй операнд и str - это lvalue.

Я думаю , что это ошибка в поддержке C ++ 0x в VS2010.

...