Как сделать кортеж из константных ссылок?

Скажем, есть две функции:

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

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

и вызывает эти функции:

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

GCC 4.7.2 не компилирует последнюю строку и выдает сообщение об ошибке, например:

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&>’

Первый вопрос: соответствует ли это стандарту C ++ 11, а если нет, то почему?

Кроме того, чтобы преодолеть эту проблему, необходимо передать набор константных ссылок наgg вместо передачи кортежа неконстантных ссылок (которыеstd::tie делает). Это может быть сделано:

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

однако дополнительный вызовstd::cref это утомительно, так что было бы здорово иметь что-то вродеctie который сделал бы кортеж константных ссылок.

Второй вопрос: есть ли необходимость писатьctie вручную, и если да, то это лучший способ сделать это?

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

Ответы на вопрос(1)

Ваш ответ на вопрос