在C++ 11中,如何获得没有名称的临时左值?

not*_*ser 18 c++ lvalue c++11

我有一个传统的C lib,而function(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
}
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 24

我只是创建一个包装器,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);
Run Code Online (Sandbox Code Playgroud)

  • "医生,当我把头撞到墙上时会疼!" "好吧不要那样做!" +1 (4认同)

Man*_*rse 20

编写一个函数模板来将rvalues转换为lvalues:

template<typename T>
T &as_lvalue(T &&val) {
    return val;
}
Run Code Online (Sandbox Code Playgroud)

现在,使用它:

deref(&as_lvalue(42));
Run Code Online (Sandbox Code Playgroud)

警告:这不会延长临时的生命周期,因此在创建临时表达式的完整表达式结束后,不得使用返回的引用.

  • @ Cheersandhth.-Alf除了旁路`运算符&'重载,我们不想这样做我们呢? (2认同)

eca*_*mur 10

您可以绑定const对临时的引用:

cout << deref(addressof<const int>(42)) << endl;
Run Code Online (Sandbox Code Playgroud)

  • 我希望读者明白,比利到目前为止所说的一切都没有技术上的意义,而且到目前为止,这并不是因为任何误解造成的. (4认同)
  • @Cheers"C++程序员必须一直处理有限的嵌套生命周期,没问题." - "没问题"?我声称它是现代C++中(如果不是**)最大的错误来源之一. (2认同)