C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么在推导类型时剥离模板参数的限定符?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在使用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打印的内容

@H_669_2@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&但是在f中它只是int.显然,在推断实例化f模板时要使用的类型时,剥离了引用到const的部分.调整示例时,调用f就像

f<T>( v );

类型是const int&在f和g中.这是为什么?这是指定的行为吗?我秘密地依赖于传递给f的v函数参数的类型,但显然它不是.

解决方法

答案是尽管变量v的类型为const int&,但表达式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)

大佬总结

以上是大佬教程为你收集整理的c – 为什么在推导类型时剥离模板参数的限定符?全部内容,希望文章能够帮你解决c – 为什么在推导类型时剥离模板参数的限定符?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。