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 回答