Как сделать кортеж из константных ссылок?
Скажем, есть две функции:
void ff( const std::tuple ) { }
template < typename TT >
void gg( const std::tuple ) { }
и вызывает эти функции:
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’ is not derived from ‘std::tuple’
Первый вопрос: соответствует ли это стандарту C ++ 11 и нет, тогда почему?
Кроме того, чтобы преодолеть эту проблему, необходимо передать набор константных ссылок наgg
вместо передачи кортежа неконстантных ссылок (которыеstd::tie
делает). Это может быть сделано:
gg( std::tie( std::cref(x) ) );
однако дополнительный вызовstd::cref
это утомительно, так что было бы здорово иметь что-то вродеctie
который сделал бы кортеж константных ссылок.
Второй вопрос: есть ли необходимость писатьctie
вручную, и если да, то это лучший способ сделать это?
template < typename... T >
std::tuple ctie( const T&... args )
{
return std::tie( args... );
}