使用C++ 17,我们将有可能返回不可移动(包括不可复制)类型,例如std::mutex,通过可以被认为是有保证的返回值优化(RVO):通过简化的值类别保证复制省略:
struct nocopy { nocopy(nocopy&) = delete; nocopy() = default; };
auto getRVO(){
return nocopy();
}
Run Code Online (Sandbox Code Playgroud)
我们还将具有结构化绑定,允许:
tuple<T1,T2,T3> f();
auto [x,y,z] = f();
Run Code Online (Sandbox Code Playgroud)
template<typename T1,typename T2,typename T3>
struct many {
T1 a;
T2 b;
T3 c;
};
// (Original questions missed 'many' on the next line. Thanks, T.C.)
auto f(){ return many{string(),5.7, false} };
auto [x,y,z] = f();
Run Code Online (Sandbox Code Playgroud)
但这些功能是否可以实现这样的功能呢?
auto get_ensured_rvo_str(){
return std::pair(std::string(),nocopy());
}
auto get_class_and_mutex(){
return many{SomeClass(),std::mutex(),std::string()}; …Run Code Online (Sandbox Code Playgroud) 使用many如下所示的模板结构,可以返回一组固定的可能不可移动的对象,并使用c ++ 17结构化绑定接收它们(auto [a,b,c] = f();声明变量ab和c并从f返回它们的值,例如结构或元组).
template<typename T1,typename T2,typename T3>
struct many {
T1 a;
T2 b;
T3 c;
};
// guide:
template<class T1, class T2, class T3>
many(T1, T2, T3) -> many<T1, T2, T3>;
auto f(){ return many{string(),5.7, unmovable()}; };
int main(){
auto [x,y,z] = f();
}
Run Code Online (Sandbox Code Playgroud)
正如在这两个问题和答案中所解释的那样(Do std :: tuple和std :: pair是否支持聚合初始化?
特别是ecatmur接受的答案,还有多个返回值(结构化绑定)和不可移动的类型以及C++中保证的RVO 17),std::tuple不支持聚合初始化.这意味着它不能用于保存和返回不可移动的类型.但是一个简单的结构many可以做到这一点,这导致了一个问题:
是否可以创建一个many可以使用任意数量参数的可变版本?
更新:在模板版本中many,是否允许使用以下指南语法?
template<typename Args...>
many(Args...) -> many<Args...>;
Run Code Online (Sandbox Code Playgroud)