Многократные возвращаемые значения (структурированные привязки) с неподвижными типами и гарантированным RVO в C ++ 17
С C ++ 17 у нас будет возможность возвращать неподвижные (включая не копируемые) типы, такие какstd::mutex
через то, что можно рассматривать как гарантированную гарантированную возвращаемую стоимость (RVO):Гарантированное копирование через упрощенные категории значений:
struct nocopy { nocopy(nocopy&) = delete; nocopy() = default; };
auto getRVO(){
return nocopy();
}
У нас также будетструктурированные привязки, позволяющий:
tuple<T1,T2,T3> f();
auto [x,y,z] = f();
или (здесь также, используя мое понимание функциивывод аргументов шаблона для конструкторов)
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();
Но эти функции составляют, чтобы включить что-то вроде этого?
auto get_ensured_rvo_str(){
return std::pair(std::string(),nocopy());
}
auto get_class_and_mutex(){
return many{SomeClass(),std::mutex(),std::string()};
}
int main(){
auto rvoStr = get_ensured_rvo_str().first;
auto [ mtx,sc,str ] = get_class_and_mutex();
}
Я думаю, что для того, чтобы это работало, это потребовало бы гарантированного RVO агрегатных аргументов конструктора при формированииstd::tuple
или жеmany
, но разве это не будет названо RVO (NRVO), которое специально не включено в предложение P0144R2?
Примечание: P0144R2 особо отмечает, что поддерживаются только типы перемещения:
2.6 Типы только для перемещенияПоддерживаются только типы перемещения. Например:
struct S { int i; unique_ptr<widget> w; };
S f() { return {0, make_unique<widget>()}; }
auto [ my_i, my_w ] = f();