我在此严格提及c ++草案(N4659)。给出以下示例,
int&& f();
auto x5a = f(); // decltype(x5a) is int
我不确定为什么推断的类型为int
,而不是int&&
。斯科特迈耶斯在他的书中说过
...,忽略初始化表达式的引用。
但是,我无法在上面的草稿中找到确保声明的任何段落。以下是我为推断类型所采取的步骤:
根据10.1.7.4.1 [dcl.type.auto.deduct]第2段,
包含占位符类型和相应初始值设定项
T
的类型e
的确定如下:
- ...
- 对于使用包含占位符类型的类型声明的变量,
T
是变量的声明类型,e
是初始值设定项...
因此,T
为auto
,e
为f()
。
根据10.1.7.4.1 [dcl.type.auto.deduct]第4段,
如果占位符是自动类型说明符,...从
P
获取T
,将auto的出现替换为新发明的 类型模板参数U
或,...使用函数调用" 中的模板参数推导规则,为U
"推导一个值,其中P
是函数模板参数类型,相应的参数是e
...
因此,P
为U
,A
为int&&
。
根据17.8.2.1 [temp.deduct.call]第2段,
如果
P
不是参考类型:
- 如果
A
是数组类型,...- 如果
A
是函数类型,...- 如果
醇>A
是cv限定类型,...
虽然P = U
确实不是参考类型,但A = int&&
仍然保持这种状态,因为上述三种情况不适用于A
。
这些是我认为与此特定案例相关的唯一段落。 总之,U = int&&
和整个T
也是int&&
。
我在这里肯定遗漏了一些东西,我不确定那些是什么。 如果您足够友好地回答这个问题,您是否会将自己局限于正式措辞(在c ++草案或标准的帮助下)?