C++11 具有多个参数的'decltype'的含义

C++11 具有多个参数的'decltype'的含义,c++11,C++11,我在哪找到的 OP和回答者似乎都认为 decltype(t,u)取决于t和u的类型 我假设decltype(t,u) 在链接问题中,是与 t和u,在某种意义上是最小的和兼容的。 如果其含义类似于§5(9)或定义中的普通类型 对于§20.9.7.6(3)中的std::common_type,则预期含义为 decltype(true?t:u) 然而,C++11似乎只定义了一个参数decltype。 也就是说,解析器被指定为接受decltype(expression) 其中表达式可以是以逗号分隔的赋值

我在哪找到的 OP和回答者似乎都认为
decltype(t,u)
取决于
t
u
的类型

我假设
decltype(t,u)
在链接问题中,是与
t
u
,在某种意义上是最小的和兼容的。 如果其含义类似于§5(9)或定义中的普通类型 对于§20.9.7.6(3)中的
std::common_type
,则预期含义为
decltype(true?t:u)

然而,C++11似乎只定义了一个参数
decltype
。 也就是说,解析器被指定为接受
decltype(
expression
其中表达式可以是以逗号分隔的赋值表达式列表。 重新阅读§7.1.6.2(4)中的
decltype
规范, 我必须将
decltype(t,u)
解释为
decltype((u))

问:那么什么是
decltype(t,u)
呢?我错过什么了吗

编辑:当答案集中在“这是逗号运算符”上时,我仍然希望看到

您对它是
decltype((u))
(对声明类型的引用)还是
decltype(u)
(声明类型)的判断。我怀疑是前者。

逗号这里是运算符,不是参数分隔符这里是运算符,不是参数分隔符这里是运算符,不是参数分隔符这里是运算符,不是参数分隔符这里是运算符,不是参数分隔符它使用逗号运算符。所以t,u是u类型。

它使用逗号运算符。所以t,u是u类型。

它使用逗号运算符。所以t,u是u类型。

它使用逗号运算符。所以t,u是类型u。

假设
decltype(u)
产生某种类型
u
(声明的类型
u
),那么
decltype((u))
decltype((t,u))
将是类型
u&
。因此,如果我们假设
decltype(t,u)
decltype((t,u))
相同,那应该与
decltype((u))
相同,而不是
decltype(u)
,对吧?假设
decltype(u)
产生某种类型
u
(声明的
u
),那么
decltype((u))
decltype((t,u))
将是
U&
类型。因此,如果我们假设
decltype(t,u)
decltype((t,u))
相同,那应该与
decltype((u))
相同,而不是
decltype(u)
,对吧?假设
decltype(u)
产生某种类型
u
(声明的
u
),那么
decltype((u))
decltype((t,u))
将是
U&
类型。因此,如果我们假设
decltype(t,u)
decltype((t,u))
相同,那应该与
decltype((u))
相同,而不是
decltype(u)
,对吧?假设
decltype(u)
产生某种类型
u
(声明的
u
),那么
decltype((u))
decltype((t,u))
将是
U&
类型。因此,如果我们假设
decltype(t,u)
decltype((t,u))
相同,那么应该与
decltype((u))
相同,而不是与
decltype(u)
相同,对吗?谢谢,我怀疑是这样的。但是我的解释是否正确,这使得返回的类型引用了声明的
u
类型,也就是说,
decltype((u))
而不是
decltype(u)
?我不确定我是否在遵循。为什么括号必须与内容的类型相关?我没有从标准草案中寻找确认,但似乎编译器(g++,vc,intel)同意您的意见:
decltype(t,u)
is
decltype((u))
这是因为decltype有两种情况,一种是直接引用对象,decltype(var),decltype(obj.var)和decltype(ptr->var)是var的类型。其他所有内容都使用表达式的规则,其中xvalue变成T&,左值变成T&而其他所有内容都变成T。谢谢,我怀疑。但是我的解释是否正确,这使得返回的类型引用了声明的
u
类型,也就是说,
decltype((u))
而不是
decltype(u)
?我不确定我是否在遵循。为什么括号必须与内容的类型相关?我没有从标准草案中寻找确认,但似乎编译器(g++,vc,intel)同意您的意见:
decltype(t,u)
is
decltype((u))
这是因为decltype有两种情况,一种是直接引用对象,decltype(var),decltype(obj.var)和decltype(ptr->var)是var的类型。其他所有内容都使用表达式的规则,其中xvalue变成T&,左值变成T&而其他所有内容都变成T。谢谢,我怀疑。但是我的解释是否正确,这使得返回的类型引用了声明的
u
类型,也就是说,
decltype((u))
而不是
decltype(u)
?我不确定我是否在遵循。为什么括号必须与内容的类型相关?我没有从标准草案中寻找确认,但似乎编译器(g++,vc,intel)同意您的意见:
decltype(t,u)
is
decltype((u))
这是因为decltype有两种情况,一种是直接引用对象,decltype(var),decltype(obj.var)和decltype(ptr->var)是var的类型。其他所有内容都使用表达式的规则,其中xvalue变成T&,左值变成T&而其他所有内容都变成T。谢谢,我怀疑。但是我的解释是否正确,这使得返回的类型引用了声明的
u
类型,也就是说,
decltype((u))
而不是
decltype(u)
?我不确定我是否在遵循。W