以下代码显示,如果模板采用 ref-to-const
参数用引用类型实例化(例如,int&
),参数不是const
:
#include <iostream>
template<typename T>
void f(const T& arg) // arg isn't const if T is a reference type
{
arg = -1;
}
int main()
{
int x = 0;
f<int&>(x); // instantiate f with reference type
std::cout << x << '\n'; // prints -1 under gcc, clang, and msvc
}
这里发生了什么?
我的猜测是初始类型arg
is int & const &
这会以某种方式转化为int&
。如果是这样,就标准而言,到底是如何发生的?如果这不是正在发生的事情,那是什么?
谢谢弗拉德(来自莫斯科)的回答C++:使用显式指定引用类型作为类型参数的模板函数,我相信关键在于const
-disappearance 是 [dcl.ref],其中表示:
在一份声明中T D
where D
有两种形式之一
& attribute-specifier-seqopt D1
&& attribute-specifier-seqopt D1
以及声明中标识符的类型T D1
is
“派生声明符类型列表 T
”,那么标识符的类型D
is “派生声明符类型列表参考T
”。可选的属性说明符序列属于引用类型。简历合格
除非引入简历限定符,否则引用格式不正确
通过使用typedef 名称([dcl.typedef], [temp.param]) 或decl类型说明符([dcl.type.simple]),在这种情况下,简历限定符将被忽略.
我已经加粗了相关文字。 (我想按照标准格式设置整个段落的格式,但我不知道如何获得正确的缩进并添加下标。)
一旦const
消失,正常参考崩溃像往常一样开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)