Why do I get a C26486 compiler error moving a deque to a vector?

  • Thread starter Thread starter david_bear
  • Start date Start date
D

david_bear

Guest
I don't know why I get a C26486 "Don't pass a pointer that may be invalid to function" when I copy or move the items using an iterator in a deque or list into a vector, but a constant_iterator works. Additionally, using an iterator works from a vector. Here is some example code:

#include <vector>
#include <deque>
#include <list>

int main()
{
std::deque<int> d_src;
std::vector<int> dest{ d_src.begin(),d_src.end() }; // C26486
std::vector<int> dest_c{ d_src.cbegin(),d_src.cend() };
std::deque<int> dest2{ d_src.begin(),d_src.end() }; // C26486

std::vector<int> v_src;
std::vector<int> v_dest{ v_src.begin(),v_src.end() };
std::deque<int> v_dest2{ v_src.begin(),v_src.end() };
std::list<int> v_dest3{ v_src.begin(),v_src.end() };

std::list<int> l_src;
std::vector<int> l_dest{ l_src.begin(),l_src.end() }; // C26486
std::vector<int> l_dest_c{ l_src.cbegin(),l_src.cend() };
}

I am using Visual Studio 2019 Community 16.2.5, Visual C++ 2019 00435-60000-00000-AA505 using the c++17 language standard. I have enabled Code Analysis on build, and I have selected "Microsoft All Rules."

If someone could explain the concept about lifetimes that I'm missing, I would appreciate it.

P.S. - I get the same error with these alternatives

std::deque<token> toks_;
std::vector<token> ret;
ret.reserve(toks_.size());
// Alternative 1
for(auto it= toks_.begin();it != toks_.end();++it)
ret.emplace_back(std::move(*it));
// Alternative 2
for (auto&& tok : toks_) ret.emplace_back(tok);
// Alternative 3
std::move(toks_.begin(), toks_.end(), std::back_inserter(ret));

Continue reading...
 
Back
Top