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中的描述确定,就好像已是 的操作数一样。Edecltype
- [dcl.type.auto.deduct] \xc2\xa74
\n这意味着返回类型T是通过以下方式推导的:
using T = decltype(E); // E = (n)\nRun 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 次 |
| 最近记录: |