以下是真实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_reference
将std::basic_string<wchar_t>&
转换为普通std::wstring
?
答案 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。许多人在有意义时会优先选择明确的返回类型。