为什么C ++ const引用可以被拼写为非const引用

时间:2018-05-14 17:52:53

标签: c++ templates reference const

考虑以下C ++程序:

#include <iostream>

template<typename T>
class A
{
public:
    explicit A(T& x) : x_(x){}
    const T& get() { return x_; }

private:
    T x_;
};

int main()
{
    int x = 42;
    A<int&>(x).get() = 43; // compiles fine, even though get() looks like it returns a const ref
    std::cout << x << '\n';
}

程序编译OK并输出43.这表明get()返回的看似const引用实际上是非const 引用,因为它允许修改它引用的值。

导致此行为的引用规则崩溃是什么?

如何强制从get()返回的引用表现得像const引用,也就是说,它不允许修改它引用的值?

1 个答案:

答案 0 :(得分:10)

  

导致此行为的引用规则崩溃是什么?

Yes。你有:

<StyledComponent autoFocus />

引用不能T = int& const T& = const (int&) & (无论如何都不能重新绑定它们,所以它被忽略了),对引用的引用只是一个参考。

所以你有

const

要解决此问题,您需要将const T& = int& 应用于基础类型,您可以通过删除引用来执行此操作:

const