Подтвердить что ты не робот

В С++ 11, как я могу получить временную lvalue без имени?

У меня есть традиционная C lib, а функция (setsockopts) хочет указать указатель. В С++ 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
}
4b9b3361

Ответ 1

Я бы просто создал обертку для 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);

Ответ 2

Напишите шаблон функции для преобразования значений r в значения lvalues:

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

Теперь используйте его:

deref(&as_lvalue(42));

Предупреждение: это не продлевает время жизни временного, поэтому вы не должны использовать возвращаемую ссылку после окончания полного выражения, в котором было создано временное.

Ответ 3

Вы можете привязать ссылку const к временному:

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