为了账号安全,请及时绑定邮箱和手机立即绑定

decltype(auto)有什么用?

decltype(auto)有什么用?

C++
吃鸡游戏 2019-12-10 13:08:59
在c ++ 14中,decltype(auto)引入了惯用语。通常,它的用途是允许auto声明使用decltype给定表达式上的规则。在搜索习惯用法的“示例”示例时,我只能想到以下内容(由Scott Meyers撰写),即函数的返回类型推导:template<typename ContainerType, typename IndexType>                // C++14decltype(auto) grab(ContainerType&& container, IndexType&& index){  authenticateUser();  return std::forward<ContainerType>(container)[std::forward<IndexType>(index)];}还有其他使用此新语言功能的示例吗?
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

在c ++ 14中,decltype(auto)引入了惯用语。


通常,它的用途是允许auto声明使用decltype给定表达式上的规则。


在搜索习惯用法的“示例”示例时,我只能想到以下内容(由Scott Meyers撰写),即函数的返回类型推导:


template<typename ContainerType, typename IndexType>                // C++14

decltype(auto) grab(ContainerType&& container, IndexType&& index)

{

  authenticateUser();

  return std::forward<ContainerType>(container)[std::forward<IndexType>(index)];

}

还有其他使用此新语言功能的示例吗?


查看完整回答
反对 回复 2019-12-11
?
三国纷争

TA贡献1804条经验 获得超7个赞

从这里报价:


decltype(auto)主要用于推导转发函数和类似包装的返回类型,在这种情况下,您希望类型精确“跟踪”正在调用的某些表达式。


例如,给定以下功能:


   string  lookup1();

   string& lookup2();

在C ++ 11中,我们可以编写以下包装函数,这些包装函数记住保留返回类型的引用性:

   string  look_up_a_string_1() { return lookup1(); }

   string& look_up_a_string_2() { return lookup2(); }

在C ++ 14中,我们可以实现以下自动化:

   decltype(auto) look_up_a_string_1() { return lookup1(); }

   decltype(auto) look_up_a_string_2() { return lookup2(); }

但是,除此以外,decltype(auto)并不打算成为广泛使用的功能。


特别是,尽管它可以用来声明局部变量,但这样做可能只是一个反模式,因为局部变量的引用性不应该依赖于初始化表达式。


另外,它对如何编写return语句也很敏感。


例如,下面的两个函数具有不同的返回类型:


   decltype(auto) look_up_a_string_1() { auto str = lookup1(); return str; }

   decltype(auto) look_up_a_string_2() { auto str = lookup2(); return(str); }

第一个返回string,第二个返回string&,这是对局部变量的引用str。

从提案中,您可以看到更多的预期用途。



查看完整回答
反对 回复 2019-12-11
  • 2 回答
  • 0 关注
  • 525 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信