簡體   English   中英

如何制作const引用的元組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM