Различия в правилах ADL между gcc 11.4 и gcc 12.1C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Различия в правилах ADL между gcc 11.4 и gcc 12.1

Сообщение Anonymous »

У меня есть следующий код, в котором библиотека определяет несколько типов в пространстве имен lib, включая шаблон типа-обертки. Он также определяет оператор+ для шаблона, но проверяет оператор+ в обернутом типе для определения типа возвращаемого значения -

Код: Выделить всё

#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
(), оба компилятора успешно его компилируют.
Если я правильно понимаю, оператор+ для оболочки не может найти оператор+ для lib::named_type, поскольку он находится за пределами пространства имен. Однако в момент создания экземпляра (в основной функции) оператор доступен в глобальном пространстве имен. Разве это не должно быть в состоянии решить эту проблему? Кроме того, поскольку один из компиляторов компилирует это правильно, является ли один из компиляторов неправильным или это поведение, определенное реализацией? Это C++11, если это имеет значение.
https://godbolt.org/z/n91Gb64sj

Подробнее здесь: https://stackoverflow.com/questions/798 ... d-gcc-12-1
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»