Как сделать кортеж из константных ссылок?
Скажем, есть две функции:
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... );
}