假设有两个功能:
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 标准,如果不符合,那为什么呢?
此外,为了克服这个问题,需要传递一个 const 引用的元组,gg
而不是传递一个非 const 引用的元组(这std::tie
使得)。这可以通过以下方式完成:
gg( std::tie( std::cref(x) ) );
然而,额外的调用std::cref
有点乏味,所以最好有类似的东西ctie
来制作一个 const 引用的元组。
第二个问题是是否需要ctie
手动编写,如果是,那么这是最好的方法吗?
template < typename... T >
std::tuple<const T&...> ctie( const T&... args )
{
return std::tie( args... );
}