其他分享
首页 > 其他分享> > c – 为什么`const T&`不确定是const?

c – 为什么`const T&`不确定是const?

作者:互联网

template<typename T>
void f(T a, const T& b)
{
    ++a; // ok
    ++b; // also ok!
}

template<typename T>
void g(T n)
{
    f<T>(n, n);
}

int main()
{
    int n{};
    g<int&>(n);
}

请注意:b是const T&和B是好的!

为什么const T&不确定是const?

解决方法:

欢迎使用const和reference collapsing.当你有const T&时,引用应用于T,const也是如此.你打电话给我

g<int&>(n);

所以你已经指定T是一个int&amp ;.当我们对左值引用应用引用时,这两个引用会折叠为单个引用,因此int& &安培;变得只是int&amp ;.然后我们从[dcl.ref]/1开始遵循规则,该规则规定如果将const应用于引用,它将被丢弃,因此int& const刚刚成为int& (请注意,您实际上不能声明int& const,它必须来自typedef或模板).这意味着

g<int&>(n);

你实际上在打电话

void f(int& a, int& b)

而你实际上并没有修改常数.

如果你把g称为

g<int>(n);
// or just
g(n);

然后T将是int,而f将被标记为

void f(int a, const int& b)

由于T不再是参考,因此const和&得到应用,你会收到编译器错误试图修改常量变量.

标签:function-templates,c,templates,const,const-reference
来源: https://codeday.me/bug/20191004/1851483.html