safety of std::begin and std::end

Refresh

2 weeks ago

Views

30 time

4

In this blog post, Eric Niebler states that:

What is wrong with std::begin and std::end? Surprise! they are not memory safe. Consider what this code does:

extern std::vector<int> get_data();
auto it = std::begin(get_data());
int i = *it; // BOOM

std::begin has two overloads for const and non-const lvalues. Trouble is, rvalues bind to const lvalue references, leading to the dangling iterator it above.

I'm having trouble understanding his point and why it is a dangling reference. Could someone explain ?

2 answers

2

get_dataФункция возвращает объект. При использовании путь показал, что объект будет временный объект, который будет разрушен , как только полное выражение заканчивается. Итератор Теперь ссылается векторный объект , который больше не существует, и не может быть разыменовываются или использоваться любым полезным способом.

1

Временный вектор возвращаемый get_dataвыходит из области видимости после std::beginсделано. Он не оставлял в живых, так что itитератор в разрушенный объект.