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