使用C 17可以编写(更新/澄清:其中nocopy是一个无法复制或移动的类,例如std :: mutex)
auto get_ensured_rvo_str(){ return std::pair(std::string(),nocopy()); }
编辑:不,这不可能在链接到答案和下面的答案中解释.
这需要聚合初始化(对于上下文:Multiple return values (structured bindings) with unmovable types and guaranteed RVO in C++17).
20.5.2.1 Construction
…
EXPLICIT constexpr tuple(const Types&…);6
Effects: The
constructor initializes each element with the value of the
corresponding parameter.
或者我们原则上可以编写自己的元组或对吗?
解决方法
// exposition only template<class... Us> tuple(Us&&... us) : values{std::forward<Us>(us)...} {} ^^ these ^^^^^^ are different objects to these
你必须使用分段构造:
return std::pair<std::string,nocopy>(std::piecewise_construct,std::forward_as_tuple(),std::forward_as_tuple());
Matt Calabrese在std-proposal列表上做了一个interesting point,现在我们已经保证了RVO应该可以编写接受工厂的组件来有效地构建他们的成员:
// hypothetical factory constructor return std::pair(std::factory_construct,[] { return std::string{}; },[] { return nocopy{}; });
另一个可能的方向是从元组和对中删除构造函数(或者更实际地,在没有构造函数的情况下编写类似于组件的组件)并依赖于new extensions to aggregate initialization应该允许通过多继承实现的元组和对的聚合初始化. Example.
原文地址:https://www.jb51.cc/c/119680.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。