在使用 Microsoft VisualStudio 2008 构建一个小示例程序时,我注意到传递给模板的类型推导有一个奇怪的事情。考虑这个例子:
template<class T>
void f( T v ) {
x; // trigger a compile error
(void)v;
}
template<class T>
void g( T v ) {
f( v );
}
void h() {
int i;
g<const int &>( i );
}
使用以下命令编译此示例cl /c foo.cpp
产生编译错误(如预期)。有趣的是“T”模板参数的值。以下是 VisualStudio 2008 打印的内容:
mini.cpp(3) : error C2065: 'x' : undeclared identifier
mini.cpp(9) : see reference to function template instantiation 'void f<int>(T)' being compiled
with
[
T=int
]
mini.cpp(14) : see reference to function template instantiation 'void g<const int&>(T)' being compiled
with
[
T=const int &
]
注意如何在g
,参数的类型是const int &
but in f
只是int
。显然,在推导实例化时要使用的类型时,对 const 的引用部分被删除了f
模板。当调整示例时,f
被调用就像
f<T>( v );
类型是const int &
同时f
and g
。这是为什么?这是指定的行为吗?我暗自依赖的类型v
要传递给的函数参数f
但显然事实并非如此。
答案是,虽然变量v
有类型const int &
, the 表达 v
是一个左值表达式,类型为const int
.
litb 提供了文本 (5/6):“如果表达式最初具有类型“对 T 的引用”(8.3.2、8.5.3),则在任何进一步分析之前将类型调整为“T”,表达式指定引用表示的对象或函数,并且表达式是左值。”
“参数”是“函数调用表达式中以括号分隔的逗号分隔列表中的表达式”(1.3.1)。所以在 14.8.2.1 中:
- “调用的相应参数类型(称之为 A)”是
const int
.
- “如果 A 是 cv 限定类型,则类型推导时将忽略 A 类型的顶级 cv 限定符”(因此,
int
).
- “推导过程试图找到模板参数值,使推导的 A 与 A 相同”(所以 T 是
int
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)