Следующая программа была создана для злоупотребления некоторыми особенностями двухфазного поиска в gcc / msvc.Он прекрасно компилируется как с gcc / msvc, так и clang, но приводит к отличному возвращаемому значению от функции g
:
struct A;
struct C {};
struct D {
D (const A &);
};
struct B {
void f (const C&,int){x=0;};
void f (const D&,char){x=1;};
int x;
};
template<typename T>
int f(const A &y)
{
B x;
x.f(y,0); // Line 18
return x.x;
}
struct A
{
operator C () const;
};
int g (const A&x)
{
return f<int>(x);
}
https://gcc.godbolt.org/z/pqAVsU
И GCC, и MSVC вызывают A::operator C
и возвращают0, в то время как Clang вызывает D(const A &)
и возвращает 1.
Верно ли в соответствии со стандартом, что clang является правильным, и вызов в строке 18 должен быть разрешен, в то время как struct A
еще не объявлен, или это такнеопределенного поведения?