C ++:使用decltype派生函数返回类型

时间:2015-04-07 12:58:04

标签: c++11 c++14 return-type decltype

以下是真实C ++ 14应用程序的(过度)简化摘录。出于可维护性的原因,我不想明确指定foo()的返回类型。我知道C ++ 14可以很好地推导函数auto的返回类型。但真正的应用程序需要函数内部的返回类型。所以我需要它。

以下代码片段编译(g ++ 4.9.2)罚款:

#include <type_traits>
#include <iostream>
#include <string>

//auto foo (std::wstring &s) -> std::remove_reference <decltype (s)>::size_type
auto foo (std::wstring &s) -> decltype (s.length ())
    {
    return s.length ();
    }

int main ()
    {
    std::wstring s {L"hello world"};
    std::cout << foo (s) << "\n";
    return 0;
    }

但是,如果我使用&#34;注释掉&#34;函数声明的版本我得到以下诊断:

foo.cpp:5:69: error: ‘size_type’ in ‘struct std::remove_reference<std::basic_string<wchar_t>&>’ does not name a type
auto foo (std::wstring &s) -> std::remove_reference <decltype (s)>::size_type
                                                                    ^

出了什么问题?不是std::wstring::size_type类型吗? 是不是std::remove_referencestd::basic_string<wchar_t>&转换为普通std::wstring

1 个答案:

答案 0 :(得分:5)

std::remove_reference没有size_type成员,std::wstring。您可以std::wstring访问std::remove_reference<decltype(s)>::type。因此,您真正需要的返回类型是:

std::remove_reference <decltype (s)>::type::size_type

由于您使用的是C ++ 14,因此可以使用std::remove_reference_t代替,这是为了便于阅读而引入的别名模板快捷方式:

std::remove_reference_t <decltype (s)>::size_type

编辑:正如@Cassio在评论中所指出的那样,由于你使用的是C ++ 14,你也可以让函数推导出auto的返回类型,这将自动删除参考:

auto foo (std::wstring &s)
    {
    return s.length ();
    }

那就是说,你应该考虑when you really want to do it。许多人在有意义时会优先选择明确的返回类型。