Есть несколько старых C API, которые всегда принимают аргументы по указателю, даже если они фактически являются логическими значениями только для чтения и т. Д. Я не рекомендую это - больше для интереса - но если вы хотите перейти к целому блин, ты мог бы сделать что-то хакерское вроде:
#include <iostream>
struct X
{
X(int n) : n_(n) { std::cout << "X()\n"; }
~X() { std::cout << "~X()\n"; }
operator int&() { return n_; }
operator const int() const { return n_; }
int* operator&() { return &n_; }
const int* operator&() const { return &n_; }
int n_;
};
// for a function that modifies arguments like this you'd typically
// want to use the modified values afterwards, so wouldn't use
// temporaries in the caller, but just to prove this more difficult
// case is also possible and safe...
void f(int* p1, int* p2)
{
std::cout << "> f(&" << *p1 << ", &" << *p2 << ")\n";
*p1 += *p2;
*p2 += *p1;
std::cout << "< f() &" << *p1 << ", &" << *p2 << "\n";
}
int main()
{
// usage...
f(&X(5), &X(7));
std::cout << "post\n";
}
Важно отметить, что временные значения действительны до тех пор, пока не завершится вызов функции f(...)
.