代码之家  ›  专栏  ›  技术社区  ›  Jonathan Boccara

为什么C++常量引用可以压缩为非常量引用

  •  9
  • Jonathan Boccara  · 技术社区  · 6 年前

    考虑以下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';
    }
    

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

    是引用崩溃规则导致了这种行为吗?

    如何强制从get()返回的引用的行为类似于常量引用,也就是说,它不允许修改它引用的值?

    1 回复  |  直到 6 年前
        1
  •  10
  •   Rakete1111    6 年前

    是引用崩溃规则导致了这种行为吗?

    Yes .您有:

    T = int&
    const T& = const (int&) &
    

    引用不能是 const (你无论如何都不能重新绑定它们,所以它被忽略了)而引用一个引用就是一个引用。

    所以你有

    const T& = int&
    

    要解决此问题,您需要应用 常量 对于基础类型,可以通过删除引用执行以下操作:

    const std::remove_reference_t<T>& get() { return x_; }
    //    ^^^^^^^^^^^^^^^^^^^^^^^