2017-12-20 14 views
3

例えば、簡単な身元ファンクタ:C++ decltype(auto)またはdecltype(std :: forward <T>(value))?

template <typename T> 
class identity 
{ 
public: 
    constexpr auto operator()(T && i) -> decltype(std::forward<T>(i)) 
    { 
     return std::forward<T>(i); 
    } 
}; 

返り値のために(C++ 14以降)より良いとは何ですか:

  • -> decltype(std::forward<T>(i))または
  • -> decltype(auto)

か彼らは同じですか?

+0

' - > decltype'がない' auto'を持つことができます。 –

+2

あるいは 'decltype'セマンティクスを主張するなら' decltype(auto) 'だけです。 – StoryTeller

+2

値の意味を持つ@JakeFreeman – bolov

答えて

4

これは同じですか?

あなたが正しくそれを書くと仮定:

constexpr decltype(auto) operator()(T && i) 
{ 
    return std::forward<T>(i); 
} 

は、彼らは同じです。 [dcl.type.auto.deduct]次のよう

プレースホルダタイプを含むタイプT、及び対応 イニシャライザeが、決定される。

  • リターンと宣言された関数で発生した非破棄returnステートメントのためにTは、 宣言された戻り型であり、eは、戻りステートメントのオペランドです。 returnステートメントにオペランドがない場合、evoid()です。

プレースホルダがdecltype(auto)型指定子である場合は、Tだけでは プレースホルダーでなければなりません。 のオペランドであったかのようにeTため推定タイプは、[dcl.type.simple]に記載 と判定されdecltype関数の戻り型はdecltype(e)によってかのようreturn e;から推定される

。したがって、明示的なdecltype(std::forward<T>(i))と同じになります。

この場合

優れている何を、私は "小さいがよりある" と行きますよ。 decltype(auto)は、あまり冗長ではありません。

+0

' - > T &&'はどうですか? – cpplearner

+0

@cpplearner - 参照が折りたたまれているため、転送参照(OPにはありません)でも動作します。あなたは答えとしてそれを掲示しなければなりません。私はあまりにも疲れている – StoryTeller

関連する問題