Consider the following C 20 code; assume T to be non-movable and non-copyable:
struct Cell
{
Cell(T&& instance) : obj(std::move(instance)) {}
private:
T obj;
};
Cell cell(T{/* arguments */});
Is move elision guaranteed in the constructor of Cell?
If T were movable, would it be guaranteed that only the regular (non-move) constructor would be invoked?
CodePudding user response:
Is move elision guaranteed in the constructor of Cell?
No, the parameter instance of Cell::Cell(T&& instance) is of rvalue reference type T&&, so there can be no move elision here. The parameter instance must bind to the materialized temporary T{/* arguments */}. Then, std::move(instance) will be used to direct initialize obj.
But note that obj(std::move(instance) won't work because you're trying to initialize obj with std::move(instance) when T is neither movable neither copyable. Demo
