¿Cómo desambiguar esta construcción en un operador de conversión con plantilla?

Después de estar confundido por qué mi código me dio un error de ambigüedad en GCC pero no errores en Clang, simplifiqué el código. Se puede ver a continuación.

struct Foo
{
    // Foo(Foo&&) = delete;
    // Foo(const Foo&) = delete;
    Foo(int*) {}
};

struct Bar
{    
    template<typename T>
    operator T()
    {
        return Foo{nullptr};
    }
};

int main() { Foo f{Bar{}}; }

Los errores son los siguientes.

main.cpp:17:18: error: call to constructor of 'Foo' is ambiguous
int main() { Foo f{Bar{}}; }
                 ^~~~~~~~
main.cpp:1:8: note: candidate is the implicit move constructor
struct Foo
       ^
main.cpp:1:8: note: candidate is the implicit copy constructor
main.cpp:5:1: note: candidate constructor
Foo(int*) {}
^

No pude hacer que se compilara correctamente para Clang esta vez, así que supongo que fue solo un error de Clang y este es el comportamiento previsto.

Cuando elimino explícitamente los constructores de copiar y mover (es decir, descomentar las dos primeras líneas de código), en su lugar obtengo

note: candidate constructor has been explicitly deleted

pero sigue siendo un error. Entonces, ¿cómo haría para desambiguar la construcción aquí?

Nota que agregué específicamente laFoo{nullptr} en lugar de solonullptr, pero no hay diferencia. Lo mismo con marcar elFoo ctor explícito. Este error de ambigüedad solo ocurre cuandoBarl operador de conversión de @ tiene una plantilla.

Puedo agregar algo de SFINAE al operador de conversión, pero no estoy seguro de lo que excluiría. Por ejemplo, esto lo haría funcionar:

template<typename T, std::enable_if_t<std::is_same<T, Foo>{}>* = nullptr>

Este es otro que encontré y esta podría ser mi respuesta:

template<typename T, std::enable_if_t<!std::is_same<T, int*>{}>* = nullptr> 

Respuestas a la pregunta(2)

Su respuesta a la pregunta