Прав ли я, что возвращение объекта RAII (где деструктор выполняет специальную работу) невозможно до C ++ 17?
В общем, нет. Тип RAII должен быть создан для обработки копирования / перемещения, чтобы его можно было возвращать по значению.
В вашем конкретном случае c вы правы, что вам требуется гарантированное разрешение на копирование в C ++ 17, поскольку ваш RAII Тип не делает этого. (Что означает, что это не тип RAII)
Является ли мой подход удаления конструктора копирования и определения конструктора перемещения действительным / переносимым?
Это правильный способ остановите копирование объекта, но снова до C ++ 17 объект мог быть удален из функции, и деструктор запустил заглушку, оставленную в функции. Если вашей целью является то, что деструктор не вызывается до тех пор, пока объект не будет уничтожен на сайте вызова, тогда это не решение для вас.
Прав ли я, что в C ++ 17 вы можете переносить это с наивным кодом выше?
Да. В C ++ 17 и выше
ScopedResource factory(/* args */) {
return ScopedReseource(/* args */);
}
auto scoped = factory(/* args */));
сводится к
auto scoped = ScopedReseource(/* args */);
Если вы не можете гарантировать, что у вас будет C ++ 17, тогда вы можете используйте std::unique_ptr
для инкапсуляции вашего объекта. Это гарантирует, что даже если RVO / NRVO не будет применен, ваш объект не будет уничтожен. Это дало бы вам
std::unique_ptr<ScopedResource> factory(/* args */) {
return make_unique<ScopedReseource>(/* args */);
}