My g ++ generates a strange warning using the vector <weak_ptr> erase () method

I have C ++ code:

#include <memory>
#include <vector>
#include <string>
#include <unordered_map>

void erase_from_vector(std::vector<std::weak_ptr<int>> &mvec) {
    for (auto mvec_it = mvec.begin(); mvec_it != mvec.end(); )
        mvec_it = mvec.erase(mvec_it);
}

int main(void) {
#if 0
    std::vector<std::weak_ptr<int>> mvec;
    for (auto mvec_it = mvec.begin(); mvec_it != mvec.end(); )
        mvec_it = mvec.erase(mvec_it);
#endif
}

GCC generates a warning when I compile it as follows:

ppk@fif-cloud-dev:~$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

ppk@fif-cloud-dev:~$ g++ -fstrict-overflow -Wstrict-overflow=5 -O2 -std=c++14  warn1.cc
warn1.cc: In function ‘void erase_from_vector(std::vector<std::weak_ptr<int> >&)’:
warn1.cc:6:6: warning: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C2 -+ C1 [-Wstrict-overflow]
 void erase_from_vector(std::vector<std::weak_ptr<int>> &mvec) {
      ^

But when I change the -O2 flag to -O1, it compiles without any warning. When I save the -O2 flag and uncomment code in main (), it also compiles without any warning. The Clang compiler also does not report any warnings.

I assume this warning comes from std :: weak_ptr destructor, where the counter is decremented, but has no idea why it appears in my code.

Is there a warning caused by my error or a compiler error?

+4
source share
1

, gcc 5.4. , gcc 6.1, , .

gcc 5.4 ()

gcc 6.1 ( )

, .

, , doc ( )

, , , , , . : , .

, -Wstrict-overflow=5, , , :

, , , gcc 5.4 .

+3

Source: https://habr.com/ru/post/1677845/


All Articles