LWi*_*sey 13 c++ language-lawyer decltype-auto
decltype(auto) func(int&& n)
{
return (n);
}
Run Code Online (Sandbox Code Playgroud)
clang 12.0.1
接受此代码,但gcc 11.2.1
拒绝它:
error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
Run Code Online (Sandbox Code Playgroud)
gcc
似乎使用 return type int &&
,但带有n
内括号,这是正确的吗?
简短的答案是,decltype(auto)
应该推断到int&
这里,您发现的是一个GCC 11 错误,该错误似乎已被修复。
对于一个长答案,让我们检查一下占位符类型推导如何适用于decltype(auto)
返回类型:
\n\n包含占位符类型的类型
\n\nT
和相应的初始化子句E
确定如下:
- [dcl.type.auto.deduct] \xc2\xa72
\n请注意,我们的表达式(n)
是一个赋值表达式1),因此最后一个要点适用,即E = (n)
。这是发生的情况E
:
\n\n如果占位符类型说明符的形式为type-constraint opt
\ndecltype(auto)
,T
则应单独作为占位符。\n推导的类型按[dcl.type.decltype]T
中的描述确定,就好像已是 的操作数一样。E
decltype
- [dcl.type.auto.deduct] \xc2\xa74
\n这意味着返回类型T
是通过以下方式推导的:
using T = decltype(E); // E = (n)\n
Run Code Online (Sandbox Code Playgroud)\n要确定类型decltype(E)
表示什么:
\n\n对于表达式
\nE
, 表示的类型decltype(E)
定义如下:\n
\n- if
\nE
是一个不带括号的 [...]- 否则,如果
\nE
是 xvalue,decltype(E)
则为T&&
,其中T
是 的类型E
;- 否则,如果
\nE
是左值,decltype(E)
则为T&
,其中T
是 的类型E
;- 否则,
\ndecltype(E)
是 的类型E
。
- [dcl.type.decltype] \xc2\xa71
\nn
是一个unqualified-id,它是一个左值, 也是(n)
。因此,第二个要点适用并decltype(auto)
推导出int&
。
1)与名称相反,赋值表达式不仅仅包含赋值。如果我们足够深入地遵循语法规则,我们最终会得到Primary-Expression,其中包括id-Expression和括号。
\n 归档时间: |
|
查看次数: |
297 次 |
最近记录: |