[英]How can I return a grpc::ClientContext from a function?
我試圖通過具有用於創建 ClientContext 的函數來避免重復代碼。 以下代碼編譯:
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);
}
如果沒有將返回類型設為右值引用,或者沒有顯式 std::move(我使用的是 C++ 11,所以我相信 RVO 和復制省略號不能保證),它不會編譯。
在其他范圍內,我現在正在嘗試執行此操作,但無法編譯:
grpc::ClientContext stream_context = context_with_deadline(std::chrono::milliseconds(3000));
它嘗試創建一個臨時對象並將其復制到stream_context
,這是無法完成的,因為ClientContext
的復制構造函數是私有的(未刪除)。
有沒有辦法在不使用unique_ptr
情況下做到這一點? 如果沒有,這可以被認為是一個錯誤嗎? (似乎應該刪除復制構造函數,而不是私有的)。
注意:當我說“不編譯”時,這意味着編譯器發出了以下內容:
錯誤:'grpc::ClientContext::ClientContext(const grpc::ClientContext&)' 在此上下文中是私有的
復制構造函數是私有的,並且不存在用戶定義的移動構造函數,因此您嘗試執行的操作是不可能的。 與其從方法中返回一個新實例,不如讓它引用一個實例:
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));
這是不可能的。 在完成以下操作之前,可以使用std::unique_ptr
解決該問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.