Say there are two functions:
void ff( const std::tuple<const int&> ) { }
template < typename TT >
void gg( const std::tuple<const TT&> ) { }
and calls to these functions:
int xx = 0;
ff( std::tie( xx ) ); // passes
gg( std::tie( xx ) ); // FAILS !!
GCC 4.7.2 fails to compile the last line and reports an error note like:
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&>’
The first question is if this fits with the C++11 standard, and if it doesn't, then why?
Furthermore, to overcome this issue one needs to pass a tuple of const references to gg instead of passing a tuple of non-const references (which std::tie makes). This can be done by:
gg( std::tie( std::cref(x) ) );
however, an extra call to std::cref is kind of tedious, so it would be great to have something like ctie which would make a tuple of const references.
The second question is if there is a need to write ctie manually, and if yes, then is this the best way to do it?
template < typename... T >
std::tuple<const T&...> ctie( const T&... args )
{
return std::tie( args... );
}
The first question is if this fits with the C++11 standard, and if it doesn't, then why?
This is expected behaviour. In the second case template argument deduction fails because there is no T so that tuple<const T&> becomes tuple<int&>.
In the first case it works because tuple<int&> is implicitly convertible to tuple<const int&>. This is a user-defined conversion and as such not considered during template argument deduction.
Your questions smells a bit like an X/Y problem. Consider posting the real question that made you look for a solution involving this kind of function template/tuple combination.
Your ctie function template looks fine. But keep in mind that things like
auto t = ctie(5);
will basically produce a dangling reference. So, you might want to restrict ctie to lvalues only.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With