从返回指针的函数返回对指针的引用?

时间:2017-08-28 07:22:33

标签: c++ pointers dictionary reference

我感觉下面的两个例子是等价的,即返回对指针的引用并返回指针是一回事。这听起来很奇怪,对指针和指针的引用是相同的,但我认为在这个例子中是这样的:

#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.
}

如果这是真的,我认为这是一个非常令人困惑的语言部分,至少对我而言。

3 个答案:

答案 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*,在此示例中,您永远不会“返回引用”。在这两种情况下都会返回一个指针