Согласно Comeau, это не законно в любом случае - тот факт, что компилятор создает его, когда вы не #include <iostream>
, может быть реальной ошибкой, а не наоборот (или, по крайней мере, разногласия в интерпретации):
"stl_function.h", line 99: error: no operator "!=" matches these operands
operand types are: const A != const A
bool operator()(const _Tp& __x, const _Tp& __y) const { return __x != __y; }
^
detected during instantiation of "bool
std::not_equal_to<_Tp>::operator()(const _Tp &, const _Tp
&) const [with _Tp=A]" at line 19 of "ComeauTest.c"
"ComeauTest.c", line 10: warning: function "<unnamed>::operator!=" was declared but
never referenced
bool operator!=( const A &a, const A & b){
^
Имеет смысл, что это не компилируется - размещение operator!=
в безымянном пространстве имен по-прежнему помещает его в другое пространство имен, чем ::
, и я не совсем уверен, почему сборка g ++это без iostream
include - если вы посмотрите на вывод препроцессора из g ++, он не сделал ничего хитрого, чтобы изменить порядок кода или любую подобную чепуху, и, конечно, iostream
не определяет operator!=
для A
.
У меня нет удобной копии стандарта C ++, но эта ссылка от IBM, по крайней мере, подтверждает утверждение о том, что безымянные пространства имен плохо сочетаются с глобальным, объясняя, почемувы не можете найти operator!=
, который вы определили.
Вы также можете найти некоторую полезную информацию в Анонимность двусмысленности имен .