Неофициально, метод, ожидающий параметр по ссылке, ожидает, что ему будет передано что-то, что может быть юридически помещено в левую часть оператора присваивания (иногда называемого «lvalue»).
int main()
{
my_class a;
my_class b(&a); // Not legal: &a = 0; would be illegal because you can't change an address of a variable.
// ---
my_class a;
my_class* a_ptr = &a;
my_class b(a_ptr); // Legal: You've declared a_ptr on the stack and its value (what it points to) can be changed. The address of a_ptr would not be changeable though.
// ---
my_class* a = new my_class;
my_class* b = new my_class(a); // Legal: Again, this is on the stack and `a` could point to something else, but its own address won't be changed.
}
В этом случае стоит указать, что в большинстве случаев передача указателя по значению стоит недорого и будет работать. Если вам действительно нужно, чтобы указатель был изменяемым (передаваемым по ссылке), тогда вам нужно передать lvalue.
Другим вариантом является ссылка const
. Тогда я считаю, что вы можете передать rvalues
просто отлично.