首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将const std::string &作为参数传递的日子已经过去了吗?

将const std::string &作为参数传递的日子已经过去了吗?
EN

Stack Overflow用户
提问于 2012-04-19 23:20:58
回答 13查看 223.5K关注 0票数 646

我听过Herb Sutter最近的一次演讲,他建议用const &取代std::vectorstd::string的理由已经基本消失了。他建议现在更可取的做法是编写如下函数:

代码语言:javascript
复制
std::string do_something ( std::string inval )
{
   std::string return_val;
   // ... do stuff ...
   return return_val;
}

据我所知,在函数返回时,return_val将是一个右值,因此可以使用移动语义返回,这非常便宜。但是,inval仍然比引用的大小大得多(通常以指针的形式实现)。这是因为std::string有各种组件,包括指向堆的指针和用于短字符串优化的成员char[]。所以在我看来,通过引用传递仍然是一个好主意。

有人能解释一下赫伯为什么会这么说吗?

EN

Stack Overflow用户

发布于 2013-08-24 00:33:00

简短答案:NO! Long答案:

如果您不修改字符串(将其视为只读),请将其作为 const ref&**.**传递

(当使用它的函数计划修改它,或者您知道它将超出作用域时,(threads),const ref&显然需要保持在作用域内。不要在你的function executes)

  • If中复制** body.

const ref&

在cpp-next.com上有一个叫做的帖子。TL;DR:

指南:不要复制你的函数参数。取而代之的是,通过值传递它们,并让编译器进行复制。

^翻译

不要复制您的函数参数值-意思是:如果您计划通过将参数值复制到内部变量来修改参数值,则只需使用参数即可。

所以,不会这么做

代码语言:javascript
复制
std::string function(const std::string& aString){
    auto vString(aString);
    vString.clear();
    return vString;
}

执行此操作

代码语言:javascript
复制
std::string function(std::string aString){
    aString.clear();
    return aString;
}

当您需要修改函数体中的参数值时。

你只需要知道你打算如何在函数体中使用参数。是否为只读...如果它停留在范围之内。

票数 63
EN
查看全部 13 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10231349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档