Да, это безопасно, хотя и незаконно в текущей форме. Вы можете обойти ошибку, используя явное промежуточное приведение к типу const-reference
takesPointer( &(const Type &) getValue() );
Это делает его совершенно законным, пока временный объект жив, то есть до конца оценки полного выражения.
Более того, вы даже можете выбросить константу и изменить временный объект с помощью указателя (помните, что он будет уничтожен в конце полного выражения). Это совершенно законно, пока сам временный объект не является постоянным.
Используя оператор запятой, вы можете «растянуть» полные выражения и таким образом написать довольно обширные последовательности операций, которые работают с «долгоживущим» временным объектом
Type *p;
p = &(Type &) (const Type &) getValue(), modify(p), print(p), modifyAgain(p), print(p);
// Not using C++ casts for brevity
Практика довольно сомнительна, и в большинстве случаев это бессмысленно.