在c++ 11中,如何获得一个没有名称的临时左值

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

本文关键字:有名称 一个 c++ 何获得      更新时间:2023-10-16

我有一个传统的C库和一个函数(setsockopts)想要一个指针参数。在c++ 11 (gcc 4.8)中,我可以在不初始化命名变量的情况下传递这个参数吗?

我有以下不令人满意的解决方案:

#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
}

我只是创建一个包装器到setsockopt如果这真的是一个麻烦(未测试)

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

编写一个函数模板将右值转换为左值:

template<typename T>
T &as_lvalue(T &&val) {
    return val;
}

现在,使用它:

deref(&as_lvalue(42));

警告:这不会延长临时对象的生命周期,所以你不能在创建临时对象的完整表达式结束后使用返回的引用。

可以将const引用绑定到一个临时对象:

cout << deref(addressof<const int>(42)) << endl;