C++ 为什么可以通过复制或引用返回相同的表达式?

C++ 为什么可以通过复制或引用返回相同的表达式?,c++,compilation,C++,Compilation,我知道T和运算符[]之间的区别;和T运算符[],前者返回引用,后者返回结果的副本 但让我困惑的是,对于声明中的两种不同类型的返回类型,可以在return语句中使用相同的表达式容器[idx] 这个目标是如何实现的一个返回引用,另一个返回编译器实现的副本 以下是代码片段: template<typename T> class Array { public: #ifdef RETURN_REFERENCE T& operator[](int idx) #else

我知道T和运算符[]之间的区别;和T运算符[],前者返回引用,后者返回结果的副本

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

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

以下是代码片段:

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];
}

从根本上讲,这与本案没有什么不同:

int i = <whatever>;
int &j = i; //Reference
int k = i; //Copy
我的表达并不是孤立的。它在特定的上下文中使用,而该上下文的性质决定了表达式会发生什么

return语句在返回值类型的上下文中执行。例如,如果返回的表达式与返回值的类型不同,编译器将尝试将表达式转换为适当的类型,非常类似于float q=i;我会把我变成一个浮点数


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

它与这种情况基本相同:

int i = <whatever>;
int &j = i; //Reference
int k = i; //Copy
我的表达并不是孤立的。它在特定的上下文中使用,而该上下文的性质决定了表达式会发生什么

return语句在返回值类型的上下文中执行。例如,如果返回的表达式与返回值的类型不同,编译器将尝试将表达式转换为适当的类型,非常类似于float q=i;我会把我变成一个浮点数


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

如您所说,一个返回引用,另一个返回副本。你真正的问题是什么?@RemyLebeau为什么相同的代码片段可以被两个不同的声明使用。编译器如何实现一个返回引用,另一个返回副本的目标?表达式容器[idx]如何被类型化为T或T&-这基本上是个问题吗?是的,这是个基本问题@看不到这个评论,你似乎在问为什么同一个表达式可以通过copy或reference返回。就像你说的,一个返回引用,一个返回副本。你真正的问题是什么?@RemyLebeau为什么相同的代码片段可以被两个不同的声明使用。编译器如何实现一个返回引用,另一个返回副本的目标?表达式容器[idx]如何被类型化为T或T&-这基本上是个问题吗?是的,这是个基本问题@看不到注释,您似乎在问为什么相同的表达式可以通过复制或引用返回。