'auto'和显式变量声明表现不同

Ael*_*ned 11 c++ c++11

我有这样的事情:

class Bar;

class Foo()
{
 public:
   Foo() : bar(new Bar());
   Bar& GetBar() { return *bar.get(); }
 private:
   std::unique_ptr<Bar> bar;
};

void main()
{
   Foo foo;
   auto bar1 = foo.GetBar();
   auto bar2 = foo.GetBar(); //address of bar2 != address of bar1. why?

   Bar& bar3 = foo.GetBar();
   Bar& bar4 = foo.GetBar(); //address of bar3 == address of bar4.
}
Run Code Online (Sandbox Code Playgroud)

似乎'auto'变量是副本,因为我没有使用相同的内存地址返回Bars.如果我明确地将变量定义为Bar引用(Bar&),那么一切都按照我的预期运行.

我应该提到我正在编译vs2012.这里发生了什么?

谢谢.

Pot*_*ter 22

auto bar1 = …总是宣布一份副本.auto &&bar1选择最接近的可能引用类型,这是您想要的.

auto &&完美的转发习语.

您还可以使用其他复合类型auto,例如,auto const &或者auto *如果您想要特定的.


Ker*_* SB 13

auto像模板参数演绎一样工作.bar1并且bar2有类型Bar,所以它们是独立的副本; bar3并且bar4具有类型Bar &并且是对它们的引用*foo.bar.

  • @Aeluned:在许多情况下,您不希望这样,例如,当访问者返回常量引用时,如果访问对象中的字段,您希望获得值*now*,而不是对可能更改的值的引用.当前规范允许您通过在`auto&bar3 = ...`中添加`&`来选择是否需要引用 (11认同)
  • @Aeluned:你可以想象你想要的一切,但事实是`auto`就像模板参数演绎一样.当你有`template <typename T> void f(T);`并调用`f(foo.getBar());`时,你会推断出`T = Bar` ... (8认同)