Это может помочь, если в вашем классе нет открытых данных.
По сути, идея состоит не в том, чтобы ограничить конструкцию оболочки, а в том, чтобы использовать экземпляры можно (как вы сказали) только до тех пор, пока они являются временными значениями. Этого можно достичь, перегрузив все методы и удалив (или сделав их приватными) те, которые ссылаются на const &.
Вот простой пример:
class Wrapper
{
public:
Wrapper() = default;
Wrapper(const std::string& name) : name(name) {}
void process() && { std::cout << "Greetings from " << name << std::endl; }
// Only temporary instances of this class are allowed!
void process() const & = delete;
private:
std::string name;
};
И некоторые варианты использования:
Wrapper("John").process(); // intended use case
Wrapper j; // create whatever you want
j.process(); // error C2280: 'void Wrapper::process(void) const &': attempting to reference a deleted function
std::move(j).process(); // this is still possible
const Wrapper& t = Wrapper(); // bind the temporary to a const reference - not a problem because ...
t.process(); // error C2280: 'void Wrapper::process(void) const &': attempting to reference a deleted function
Очевидные недостатки:
- Вы должны перегрузить каждую публичную функцию-член.
- Сообщение об ошибке задерживается и не очень информативно.
Подобное было сделано в стандарте. Процедуры make для std :: reference_wrapper не принимают временные значения .
Обратите внимание, что они рассмотрели еще одну тонкость: перегрузка использует const T && вместо T &&. Это может быть важно и в нашем случае. Например, если ваша обертка специально разработана для того, чтобы ее нельзя было скопировать, и вы используете процедуры make, такие как
const Wrapper make_wrapper();
вместо
Wrapper make_wrapper();
В этом случае вы можете заменить
void process() &&;
по
void process() const &&;