2016-03-27 34 views
3

如果调用std :: vector :: begin()会发生什么,但返回的迭代器被分配给引用?它为什么工作,迭代器值存储在哪里?自动引用和迭代器

std::vector<int> v; 
auto a = v.begin(); //I assume iterator is stored on the stack in variable "a". 
auto& b = v.begin(); //What happens here? 
+0

为什么不尝试? (编译器应该对你大喊) –

+0

@DieterLücking微软的编译器会很乐意接受这个错误,把它当作自动写入&& b –

回答

7

此行

auto& b = v.begin(); 

是一个错误,因为v.begin()返回一个临时的,并且可以不结合临时到非const引用。

+1

这可能会在Microsoft编译器上编译,因为它们对C++有危险的'扩展'。 –

+0

@RichardHodges:好点。我已将“编译错误”的措辞更改为“错误”。 –

+0

是的,它适用于Microsoft编译器,并创建与正确行相同的汇编代码。混乱。我会喜欢编译器错误。 – Tom

4

无处。你有一个悬而未决的参考。不要这样做。

大多数编译器会拒绝这个,但某些版本的Visual Studio会假装你编写了const auto&并扩展了临时的生命周期。临时存储的地方是无关紧要的。