首页 > 解决方案 > 为什么可以通过复制或引用返回相同的表达式?

问题描述

T& operator[]();我知道and之间的区别T operator[](),前者返回引用,后者返回结果的副本。

但是让我感到困惑的是,对于container[idx]声明中的两种不同类型的返回类型,可以在 return 语句中使用相同的表达式。

编译器如何实现这个目标(一个返回引用,另一个返回副本)?

这是代码片段:

template<typename T>
class Array
{
 public:
 #ifdef RETURN_REFERENCE
    T& operator[](int idx)
 #else
    T  operator[](int idx)
 #endif
    {
         assert(idx<size);
         return container[idx];  // same expression works for T and T&
    }
 private:
    enum {size =100};

    T container[size];
}

标签: c++compilation

解决方案


它与这种情况基本上没有什么不同:

int i = <whatever>;
int &j = i; //Reference
int k = i; //Copy

i表达式并不孤单。它在特定的上下文中使用,并且该上下文的性质决定了表达式会发生什么。

return语句在返回值类型的上下文中执行。例如,如果返回的表达式与返回值的类型不同,编译器将尝试将表达式转换为适当的类型(很像float q = i;转换i为 a float)。

表达式本身只是标识一个对象。被识别的对象会发生什么取决于它的使用方式。如果它用于初始化引用,则创建对该对象的引用。如果它用于初始化该类型的另一个对象,则创建一个副本。


推荐阅读