![](/img/trans.png)
[英]Returning const std::string& vs const char* for class member
[英]Return a “const char*” as std::string& from a class method
我有一個C-Libraray函數返回一個C-String
const char* myFuncC(struct myS *);
現在,我編寫一個類映射器:
class myC {
private:
struct myS * hdl
...
public:
const char* myFunc() {
return myFuncC(hdl);
}
// want to have...
const std::string& myFuncS() {
return ??? myFuncC(hdl);
}
}
現在我想回到一個: const std::string&
我不想 復制 C-字符串指針數據
我該怎么做?
更新
是否有一個C ++類的行為類似於const C ++-String類,並使用const C-String指針作為字符串源?
我將此類稱為C ++-String-External … 外部均值…使用外部源作為存儲設備…在我的情況下為“ const char *”
根據定義, std::string
擁有其內存,我們無能為力。 此外,通過返回引用,您正在創建對局部變量(或內存泄漏)的懸掛引用。
但是,將連續字符范圍封裝在類似字符串的接口中而不進行復制的想法非常普遍,因此C ++ 17添加了一個新類型std::string_view
來實現此目的。 有了它,您的代碼可以編寫為:
std::string_view myFuncS() {
return {myFuncC(hdl)};
}
string_view
不是字符串,但是具有非常相似的API,其想法是使用它而不是string const&
的許多當前用法。 非常適合這里的工作。
請注意,我們將返回一個copy ,以避免懸掛參考。 但是,這不會復制基礎內存,而且很便宜-幾乎與返回引用一樣便宜。
只需返回一個新字符串:
std::string myFuncS() {
return std::string(myFuncC(hdl));
}
如果確實需要引用或指針,則在堆上分配該字符串並返回指向它的指針:
std::unique_ptr<std::string> myFuncS() {
return std::unique_ptr<std::string>(new std::string(myFuncC(hdl)));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.