decltype должен указывать тип его параметра. Предполагается, что выражение запятой должно иметь тип его правого операнда. В приведенном ниже примере все, кроме c2, являются ложными при компиляции с VS2010. Когда дело доходит до c1, это странно для меня, но явно стандартно соответствует, в то время как для c4 и c5 я не уверен ... это правильно, или это ошибка компилятора? К сожалению, мой реальный код полагался на is_reference, чтобы вернуть true, по крайней мере, для c4.Как должен работать тип decltype с оператором,
Две последние строки функции компилируются так, как ожидалось, что показывает, что фактическая оценка выражения для запятой работает.
#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;
}
Поддержка 'decltype' MSVC 2010 в лучшем случае бедна. Я сделал крах компилятора несколько раз, и просто брошу несколько других, на относительно неинтересных выражениях. – GManNickG