次の 2 つの関数があるとします。
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
は、非 const 参照のタプルを渡す代わりに、const 参照のタプルを渡す必要があります (make std::tie
)。これは次の方法で実行できます。
gg( std::tie( std::cref(x) ) );
ただし、追加の への呼び出しは面倒なので、const 参照のタプルを作成するstd::cref
ようなものがあると便利です。ctie
2 番目の質問は、ctie
手動で記述する必要があるかどうかです。必要な場合、これが最善の方法ですか?
template < typename... T >
std::tuple<const T&...> ctie( const T&... args )
{
return std::tie( args... );
}