Rozważmy następujący fragment oZależnie nazwą odnośnika w matrycy funkcji: szczęk odrzuca gcc przyjmuje
struct X { };
namespace foo {
template <class T>
void bar() { T{} < T{}; }
void operator<(const X&, const X&) {}
}
int main() {
foo::bar<X>();
}
szczęk odrzuca kod gcc akceptuje. Czy jest to błąd gcc, czy jest to błąd clang?
Nie widzę, jak to jest błąd, ponieważ typ 'T' może odnosić się do dowolnego typu. Jeśli ten typ 'T' nie przeładuje ani nie obsłuży operatora' <', wówczas funkcja' bar' zakończy się niepowodzeniem. Ponieważ przeciąłeś operatora '<', wszystko działa dobrze. Domyślam się, że wszystko idzie do tego, w jaki sposób kompilatory czytają kod, ale w sensie semantyki nie jest to podatne na błędy. – Poriferous
@Poriferous To nie ma żadnego sensu. Pytanie brzmi, jakie jest prawidłowe zachowanie 'bar()' dla typów 'T', które nie mają' operatora <'. Prawidłowe zachowanie to: "tak, znajduje' bar :: operator <"(w tym przypadku clang ma błąd) lub" kod jest źle sformułowany "(w tym przypadku gcc ma błąd). – Barry
To nie ma sensu, ponieważ 'bar' jest funkcją i nie ma operatora' '<". Ponieważ zdefiniowałeś 'operator <' dla struktury 'X', naprawdę nie widzę problemu. Nawet jeśli przeciążenie operatora zostało osadzone w strukturze 'X', kod powinien nadal poprawnie się kompilować. Aby być uczciwym, to klang ma błąd, ponieważ wydaje się, że zakłada typ. Mam na myśli, czy próbowałeś zastąpić 'foo :: bar()' z czymś takim jak 'foo :: bar ()' i sprawdzić, czy klang odrzuca również ten kod? –
Poriferous