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;
}