我感觉下面的两个例子是等价的,即返回对指针的引用并返回指针是一回事。这听起来很奇怪,对指针和指针的引用是相同的,但我认为在这个例子中是这样的:
#include <unordered_map>
struct Animal{};
std::unordered_map<std::string, Animal*> map;
Animal* createNewMapEntry()
{
return map["new entry"] = new Animal; // map subscript operator will return a reference to the mapped type
// in this case the mapped type is a pointer to Animal
// Is this the equivalent of doing:
auto p = new Animal;
map["new entry"] = p;
return p;
// In this case I am returning a pointer to Animal, not a reference to the pointer to animal.
// That's why I was afraid that in the first example, which returns a "reference" to the Animal pointer
// that it was returning the "address" of the pointer instead of the pointer, equivalent to returning
// a pointer to pointer, which is just like the address to a pointer.
}
如果这是真的,我认为这是一个非常令人困惑的语言部分,至少对我而言。
答案 0 :(得分:1)
我觉得以下两个例子是等价的。
否,他们不是。
第一个插入地图,使用键&#34;新条目&#34;并评估一个Animal
对象。
第二个不会这样做,因为它只返回指针。
正如MM所说:&#34;如果函数按值返回并返回左值,则左值将转换为prvalue,因此return语句只返回指针&#34;。
答案 1 :(得分:1)
作为函数体的复合语句的内容对函数的返回类型没有影响(除非返回类型为auto
)。
返回类型为Animal*
,不是引用类型。这些例子在语义上是等价的。
答案 2 :(得分:0)
表达式中T&
到T
的转换是C ++的一个基本方面。这是表达式评估过程中首先发生的事情之一。
见[expr]/5:
如果表达式最初具有“
T
的引用”([dcl.ref], [dcl.init.ref]),在进一步调整之前将类型调整为T
分析。表达式指定由表示的对象或函数 引用,表达式是左值或右值,取决于 关于表达。
由于map["new entry"]
的结果为Animal*&
(并且赋值表达式返回lvalue referring to the left operand),&
表达式中的return
消失, 左值 Animal*
。之后,由于createNewMapEntry()
的预期返回类型为Animal*
,因此会发生左值到右值的转换,并返回指针的副本。
注意 - 返回类型始终为声明的Animal*
,在此示例中,您永远不会“返回引用”。在这两种情况下都会返回一个指针。