Я оставил две альтернативы внутри 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
Мобильная версия