I have a traditional C lib and a function (setsockopts
) wants an argument by pointer. In C++11 (gcc 4.8), can I pass this argument without initializing a named variable?
I have the following, non-satisfying solution:
#include <iostream>
#include <memory>
int deref(int const * p) {return * p;}
using namespace std;
int main() {
int arg = 0; cout << deref(& arg) << endl;
// works, but is ugly (unnecessary identifier)
cout << deref(& 42) << endl;
// error: lvalue required as unary ‘&’ operand
cout << deref(& * unique_ptr<int>(new int(42))) << endl;
// works, but looks ugly and allocates on heap
}
I'd just create a wrapper to setsockopt
if that's really a trouble (not tested)
template <typename T>
int setsockopt(int socket, int level, int optname, const T& value) {
return setsockopt(socket, level, optname, &value, sizeof(value));
}
...
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, 1);
Write a function template to convert rvalues to lvalues:
template<typename T>
T &as_lvalue(T &&val) {
return val;
}
Now, use it:
deref(&as_lvalue(42));
Warning: this doesn't extend the lifetime of the temporary, so you mustn't use the returned reference after the end of the full-expression in which the temporary was created.
You can bind a const
reference to a temporary:
cout << deref(addressof<const int>(42)) << endl;
来源:https://stackoverflow.com/questions/23566857/in-c11-how-can-i-get-a-temporary-lvalue-without-a-name