The following code does not work in Microsoft Visual Studio 2015:
#include <vector>
#include <list>
#include <iostream>
class ListWithIterator
{
public:
ListWithIterator() : m_iterator(m_list.end()) {}
bool check() const { return m_iterator == m_list.end(); }
private:
typedef std::list<int> list_t;
list_t m_list;
list_t::const_iterator m_iterator;
};
int main(int, char**)
{
std::vector<ListWithIterator> v;
v.resize(1);
if (v[0].check())
{
std::cerr << "Yes" << std::endl;
}
else
{
std::cerr << "No" << std::endl;
}
return 0;
}
MSVC says:
"Debug Assertion Failed", "Expression: list iterators incompatible" inside
check()
function.
g++ compiles it without any warnings but it works wrong:
$ g++ sample.cpp -g -Og -Wall
$ ./a.out
No
$
I expected output "Yes", because iterator was initialized by m_list.end()
but bool check() const { return m_iterator == m_list.end(); }
returns false
.
Update:
Correct solution:
$ cat sample.cpp
#include <vector>
#include <list>
#include <iostream>
class ListWithIterator
{
public:
ListWithIterator() : m_iterator(m_list.end()) {}
ListWithIterator(const ListWithIterator& from): m_list(from.m_list), m_iterator(m_list.end())
{
}
bool check() const
{
std::cerr << m_list.size() << std::endl;
return m_iterator == m_list.end();
}
private:
typedef std::list<int> list_t;
list_t m_list;
list_t::iterator m_iterator;
};
int main(int, char**)
{
std::vector<ListWithIterator> v;
v.resize(1);
if (v[0].check())
{
std::cerr << "Yes" << std::endl;
}
else
{
std::cerr << "No" << std::endl;
}
return 0;
}
$ g++ sample.cpp -g -Og -Wall
$ ./a.out
0
Yes
$