Код: Выделить всё
#include
#include
namespace lib {
template
class named_type {};
template
class wrap {};
template
auto operator + (const wrap&, const int&) -> RetType {
return RetType{};
}
} // end of lib namespace
// User code
const char foo_t_name[] = "FooT";
using foo_t = lib::named_type;
foo_t operator + (const foo_t&, const int&) {
return foo_t{};
}
const char bar_t_name[] = "BarT";
using bar_t = lib::named_type;
namespace lib { // example where the operator is wrapped in lib namesapce
bar_t operator + (const bar_t&, const int&) {
return bar_t{};
}
}
int main(int, char**) {
lib::wrap x;
x + 1;
lib::wrap y;
y + 1;
return 0;
}
Код: Выделить всё
foo_t). Этот код компилируется с помощью gcc-11.4 (ссылки на Compiler Explorer ниже), но не компилируется с помощью gcc-12.1. Если определение оператора заключено в пространство имен libКод: Выделить всё
bar_tЕсли я правильно понимаю, оператор+ для оболочки не может найти оператор+ для lib::named_type, поскольку он находится за пределами пространства имен. Однако в момент создания экземпляра (в основной функции) оператор доступен в глобальном пространстве имен. Разве это не должно быть в состоянии решить эту проблему? Кроме того, поскольку один из компиляторов компилирует это правильно, является ли один из компиляторов неправильным или это поведение, определенное реализацией? Это C++11, если это имеет значение.
https://godbolt.org/z/n91Gb64sj
Подробнее здесь: https://stackoverflow.com/questions/798 ... d-gcc-12-1
Мобильная версия