decltype应该产生其参数的类型。 逗号表达式应该具有其右手操作数的类型。在下面的示例中,使用VS2010编译时,除c2外的所有内容均为false。说到c1,这对我来说很奇怪,但显然符合标准,而对于c4和c5,我不确定......这是正确的,还是编译错误?可悲的是,我的真实代码依赖is_reference至少在c4中返回true。
最后两行函数按预期编译,表明逗号表达式的实际评估有效。
#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 :(得分:4)
据我所知,你是正确的decltype((str, str))
和decltype((str, (str)))
都应该将int&
表示为具有逗号运算符应该具有的表达式与第二个操作数相同的值和值类别,str
是左值。
我认为这是VS2010中C ++ 0x支持的一个错误。