In C++11, how can I get a temporary lvalue without a name?

北城以北 提交于 2019-11-30 14:37:29

问题


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
}

回答1:


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);



回答2:


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.




回答3:


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!