¿Cómo hacer una tupla de constantes referencias?

Digamos que hay dos funciones:

void ff( const std::tuple<const int&> ) { }

template < typename TT >
void gg( const std::tuple<const TT&> ) { }

y llamadas a estas funciones:

int xx = 0;
ff( std::tie( xx ) ); // passes
gg( std::tie( xx ) ); // FAILS !!

GCC 4.7.2 no compila la última línea e informa una nota de error como:

note:   template argument deduction/substitution failed:
note:   types ‘const TT’ and ‘int’ have incompatible cv-qualifiers
note:   ‘std::tuple<int&>’ is not derived from ‘std::tuple<const TT&>’

La primera pregunta es si esto encaja con el estándar C ++ 11, y si no, ¿por qué?

Además, para superar este problema, se necesita pasar una tupla de referencias constantes agg en lugar de pasar una tupla de referencias no constantes (questd::tie hace). Esto se puede hacer por:

gg( std::tie( std::cref(x) ) );

sin embargo, una llamada extra astd::cref es un poco tedioso, por lo que sería genial tener algo comoctie Lo que haría una tupla de constantes referencias.

La segunda pregunta es si hay necesidad de escribir.ctie manualmente, y si es así, ¿es esta la mejor manera de hacerlo?

template < typename... T >
std::tuple<const T&...> ctie( const T&... args )
{
    return std::tie( args... );
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta