【问题标题】:C++11 Avoiding Redundant Return Type in specific SituationC++11 在特定情况下避免冗余返回类型
【发布时间】:2016-04-27 06:47:29
【问题描述】:

好的,谢谢所有看过这个的人。我已经在下面的链接中重新创建了确切的场景以便于查看,因此我将注释掉我所拥有的原始文本,因为它并不清楚。 http://cpp.sh/5lp4l

在评论部分,我展示了在没有指定调用的数据类型声明的情况下调用 make_some(32, std::string{"hi"})。我意识到这似乎很疯狂并且远远超出了我的预期用例,根据参数自动推断复合类型(推断我想要的数据,基于 int/string)不是必需的,也不是一个好主意。

【问题讨论】:

  • 对于QueryResult<int, int>,底层boost::optional 模板参数是什么?或者换句话说,如果QueryResult 只是boost::optional 的一个包装器,它怎么会有多个模板参数呢?
  • 请发MCVE 重现您所看到的编译错误。你的问题有太多的未知数(最大的一个是QueryResult)的细节。你在somefn里面写的cmets没有任何意义。
  • return QueryResult<T>(std::forward(args));肯定是错的,应该是return QueryResult<T>(std::forward<Args>(args)...);
  • 所有的cmets都是对的。我已经发布了完整 MVE 的 URL,谢谢! cpp.sh/5lp4l
  • 您假设的问题在于您认为要推断的正确类型是Data,因为它可以由intstd::string 构成。问题是,std::vector<std::string> 也可以!而且你不能指望编译器检查每一种可能的类型(包括模板类型),看看它是否有一个与你的参数匹配的 ctor。

标签: c++ c++11 decltype return-type-deduction trailing-return-type


【解决方案1】:

编译器是对的。 TArgs 之间没有任何关系。因此,它无法确定QueryResult<T> 的含义。

您显然期望somefn 的返回类型强制Tint, int。这显然是不可能的,原因有两个:T 表示单一类型,并且没有任何机制可以让return 语句以某种方式影响make_some 的模板实例化。

【讨论】:

    【解决方案2】:

    您是否尝试过使用auto 作为类型声明?

    同样decltype (variable_here) variable_to_inherit_type; 将第二个变量的类型设置为第一个变量的类型。您可能可以首先使用它设置与传入变量相同的类型。

    我不确定这是否适用于您的情况,但如果有帮助,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2011-06-16
      • 2017-08-10
      • 1970-01-01
      相关资源
      最近更新 更多