[英]How to make a tuple of const references?
說有兩個功能:
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
make)。 這可以通過以下方式完成:
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... );
}
第一個問題是,如果這符合C ++ 11標准,如果不符合,那么為什么呢?
這是預期的行為。 在第二種情況下,模板參數推斷失敗,因為沒有T
使得tuple<const T&>
變為tuple<int&>
。
在第一種情況下它可以工作,因為tuple<int&>
可以隱式轉換為tuple<const int&>
。 這是用戶定義的轉換,因此在模板參數推斷期間不予考慮。
你的問題有點像X / Y問題。 考慮發布真正的問題,讓您尋找涉及這種功能模板/元組組合的解決方案。
您的ctie
函數模板看起來很好。 但請記住這樣的事情
auto t = ctie(5);
基本上會產生一個懸空參考。 因此,您可能只想將ctie
限制為ctie
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.