¿Cómo puedo usar rasgos de tipo para hacer que esta conversión de matriz a puntero sea inequívoca?

Me gustaría discernir entre matrices estáticas y punteros.

El siguiente ejemplo no se puede compilar debido aconversiones de matriz a puntero que tienen coincidencia exactahaciendo ambosfooLos posibles candidatos.

¿Puedo obtener la segunda sobrecarga defoo ser seleccionado sin ambigüedades usando rasgos de tipo?

#include <iostream>

template<typename T>
void foo(const T* str)
{
    std::cout << "ptr: " << str << std::endl;
}

template<typename T, size_t N>
void foo(const T (&str)[N])
{
    std::cout << "arr: " << str << std::endl;
}

int main()
{
    foo("hello world"); // I would like the array version to be selected
    return 0;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta