2011-01-29 2 views
2

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

Поддержка 'decltype' MSVC 2010 в лучшем случае бедна. Я сделал крах компилятора несколько раз, и просто брошу несколько других, на относительно неинтересных выражениях. – GManNickG

ответ

4

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

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

Смежные вопросы