Как я могу вернуть grpc :: ClientContext из функции? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь избежать повторяющегося кода, имея функцию для создания ClientContexts.Компилируется следующий код:

template<typename T>
grpc::ClientContext&& context_with_deadline(T duration) {
    grpc::ClientContext context;
    auto deadline = std::chrono::system_clock::now() + duration;
    context.set_deadline(deadline);
    return std::move(context);
}

Он не компилируется без указания типа возвращаемого значения как ссылки на rvalue или без явного указания std :: move (я использую C ++ 11, поэтому я считаю, что RVO и ellision копирования негарантировано).

В какой-то другой области я сейчас пытаюсь сделать это, которое не компилируется:

grpc::ClientContext stream_context = context_with_deadline(std::chrono::milliseconds(3000));

Он пытается создать временный объект и скопировать его в stream_context, что нельзя сделать, потому что конструктор копирования ClientContext является личным (не удален).

Есть ли способ сделать это без использования unique_ptr?Если нет, можно ли это считать ошибкой?(кажется, что конструктор копирования должен быть удален, а не закрытым).

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

ошибка: 'grpc :: ClientContext :: ClientContext (const grpc :: ClientContext &)' является закрытым в этом контексте

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Это невозможно.Эту проблему можно обойти с помощью std::unique_ptr, пока не будет выполнено следующее:

https://github.com/grpc/grpc/issues/16680

0 голосов
/ 22 сентября 2018

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

template<typename T>
void context_with_deadline(grpc::ClientContext& context, T duration) {
    auto deadline = std::chrono::system_clock::now() + duration;
    context.set_deadline(deadline);
}

, а затем вызвать его так:

grpc::ClientContext stream_context;
context_with_deadline(stream_context, std::chrono::milliseconds(3000));
...