2

この関数は正常に機能します。

std::string get_str() {
  return std::get<0>( make_tuple(std::string("hi")) );
}

しかし、で定義された末尾の戻り値decltypeで同じことを行おうとすると、関数はぶら下がっている右辺値参照を返します

auto get_str() -> decltype( std::get<0>( make_tuple(std::string("hi")) ) ) {
  return std::get<0>( make_tuple(std::string("hi")) );
}

使用したいトレーリングリターンタイプのクールなアプリケーションがありますstd::get。残念ながら、この場合の戻り値の型std::get 右辺値の参照であるため、その役割を果たしてdecltypeいるだけです...

末尾の戻り値タイプを使用する方法を知っていますがdecltype、ぶら下がっている右辺値参照を避けていますか?

4

3 に答える 3

3

使用するstd::remove_reference

auto get_str() -> 
std::remove_reference<
    decltype( std::get<0>( make_tuple(std::string("hi")) ) )
    >::type {
  return std::get<0>( make_tuple(std::string("hi")) );
}
于 2012-07-04T09:28:31.443 に答える
3

あなたが望むように聞こえますstd::remove_reference。したがって、あなたの場合は、末尾のリターンタイプを次のように変更するだけです。
std::remove_reference<decltype( std::get<0>( make_tuple(std::string("hi")) ) )>::type

于 2012-07-04T09:28:34.627 に答える
3

標準remove_referenceタイプの特性を使用して参照を削除できます。

#include <string>
#include <tuple>
#include <type_traits>

auto get_str() ->
    std::remove_reference<
        decltype( std::get<0>( make_tuple( std::string("hi") ) ) )
    >::type
{
    return std::get<0>( make_tuple( std::string("hi") ) );
}
于 2012-07-04T09:28:36.793 に答える