Чтобы передать временный объект в функцию, он должен принимать аргумент либо по значению, либо по постоянной ссылке. Непостоянные ссылки на временные объекты не допускаются. Таким образом, любое из следующих должно работать:
void someFunc(const Ref&);
someFunc(Ref(Foo)); // OK, constant reference to temporary
void someFunc(Ref);
someFunc(Ref(Foo)); // OK, copy of temporary
void someFunc(Ref&);
someFunc(Ref(Foo)); // Invalid, non-constant reference to temporary
Ref ref(Foo);
someFunc(ref); // OK, non-constant reference to named object
Кстати, вызов типа Ref
и экземпляра pointer
, когда он не является ни ссылкой, ни указателем, может быть немного запутанным.