Странные различия между компиляторами относительно SFINAE и разрешения перегрузкиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Странные различия между компиляторами относительно SFINAE и разрешения перегрузки

Сообщение Anonymous »

Вот фрагмент, который не зависит от каких-либо внешних включений и ведет себя по-разному в msvc/gcc/clang.
Я оставил две альтернативы внутри main.
Он компилируется с помощью gcc в обеих альтернативах; не компилируется с msvc ни в одном из вариантов.
Однако он компилируется в clang, только если я создаю именованную переменную, а не временную.
Может ли кто-нибудь объяснить такое поведение?
Я тестировал -std=c++23 на clang 21.1.2, но с другими версиями он ведет себя аналогично.

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

struct A
{
};

template 
struct B
{
template 
struct I
{
typedef typename T1::template W::type type;
};

// if I remove this template member function, it compiles everywhere
template 
typename I::type f(T o)
{
return {};
}

void f(A)
{
}
};

struct C
{
};

int main()
{
B().f(A{}); // does not compile (clang)
//B obj; obj.f(A{}); // compiles (clang)
}
Демонстрация в реальном времени


Подробнее здесь: https://stackoverflow.com/questions/798 ... resolution
Ответить

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

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

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

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

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