Comportamiento diferente entre conversión explícita, inicialización directa e inicialización de copia

Tengo una claseC que tiene un operador de casting para cualquier cosa. En el ejemplo intenté enviar una instancia destd::string de tres maneras diferentes:static_cast, constructor destd::string y asignando astd::string. Sin embargo, solo el último se compila, mientras que los otros generan un error de constructor ambiguo.

La razón del error es bastante clara: hay muchas formas de convertirC a algo que el constructor destd::string poder aceptar. Pero, ¿cuál es la diferencia entre estos casos? ¿Por qué el operador de reparto funciona como se pretende aquí pero no allí?

struct C {
    template<typename T>
    operator T() const {
        return T{};
    }
};

int main() {
    C c;

    cout << static_cast<string>(c) << endl; // compile error
    string bad(c); // compile error
    string ok = c; // compiles successfully
}

UPD: como bolov mencionó en los comentarios, este problema no se reproduce con C ++ 17. Lo probé con g ++ - 5 y clang-3.8 con -std = c ++ 11 y -std = c ++ 14, y muestra los errores descritos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta