Esto podría hacer el trabajo a menos que su clase tenga miembros de datos públicos.
Básicamente, la idea no es restringir la construcción de la envoltura, sino asegurarse de que las instancias pueden ser utilizadas (como usted dijo) solo mientras sean valores temporales.Se puede lograr esto al sobrecargar todos los métodos y eliminarlos (o hacerlos privados) los que se refieren a const &.
Aquí está un ejemplo sencillo:
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;
};
Y algunos casos de uso:
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
Las desventajas obvias son:
- Tienes que sobrecargar cada función miembro pública.
- El mensaje de error está retrasado y no es muy informativo.
Algo similar se ha hecho en la norma. Las rutinas make para std :: reference_wrapper do not accept temporaries.
Nota que consideraban otra sutileza: la sobrecarga utiliza const T & & en lugar de T & &. Esto también puede ser importante en nuestro caso. Por ejemplo, si su envoltura está diseñada deliberadamente para ser noncopyable y utiliza realizar rutinas tales como
const Wrapper make_wrapper();
en lugar de
Wrapper make_wrapper();
En este caso, es posible que desee reemplazar
void process() &&;
por
void process() const &&;
¿Estás de acuerdo? ¿Es posible solo permitir que se creen instancias en la pila en lugar de en el montón? –
no, solo como provisionales. todavía es peligroso crear tales instancias en la pila –
A veces, el mejor preventivo es un comentario de "do not do X" en la documentación. –