https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89358
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- I see this warning even when compiling preprocessed source that was all produced using -std=c++14 (so the input source code is identical): g++ -E main.cpp -o main.ii g++ -E test.cpp -o test.ii g++ -flto -c main.ii -std=c++17 g++ -flto -c test.ii g++ -flto main.o test.o /usr/include/c++/8/bits/stl_function.h:381:12: note: type ‘struct less’ itself violates the C++ One Definition Rule struct less : public binary_function<_Tp, _Tp, bool> ^ So this appears to be a difference introduced by the compiler, not the source code. Either there's a compiler bug causing unwanted differences depending on -sd options, or the warnings need to be suppressed because the differences are intended.