繁体   English   中英

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

[英]Why is `const T&` not sure to be 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);
}

请注意: bconst T&++b是可以的!

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

欢迎来到const和引用折叠 当你有const T& ,引用被应用于Tconst也是如此。 你叫g

g<int&>(n);

所以你已经指定T是一个int& 当我们对左值引用应用引用时,这两个引用会折叠为单个引用,因此int& &只是int& 然后我们从[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& get应用于它,并且您将尝试修改常量变量时​​收到编译器错误。

我知道已经有一个已经接受的答案是正确的,但只是添加一点,甚至在模板领域之外,只是在函数声明中...

( const T& ) 

是不一样的

( const T )

在与第一个匹配的示例中,您有一个const引用。 如果您真的想要一个不可修改的const值,请删除第二个示例中的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM