const引用很糟糕C++ 11

use*_*862 5 c++ int const reference

我在YouTube上观看Bjarne Stroustrup,我试图弄清楚为什么这被认为是坏的,因为他说这是C++ 98风格的坏代码

void setInt(const unsigned int &i)
void takeaString(const std::string &str)
Run Code Online (Sandbox Code Playgroud)

我的意思是你传递一个常量的引用,所以你保存自己的复制操作,它甚至不使用像传递指针,所以它不必解除引用,所以为什么它是坏的?

Chr*_*ckl 7

在pre-C++ 11中,一般的经验法则是,如果不修改参数,则按值传递内置类型,使用const&传递类或结构的对象,因为类或结构的对象通常是如此之大以至于const&在绩效方面付出了代价.

现在这是一个相当随意的规则,当然你也会看到异常(例如标准库中的迭代器)但它在实践中运行良好并且是一种既定的习惯用法.当你看到f(int const &i)f(std::string s)在其他程序员的代码中,你会想知道原因,如果没有明显的原因,人们会感到困惑.

在C++ 11中,故事可能有所不同.很多人声称由于新的语言特性(移动语义和右值引用),按值传递大对象不再是性能问题,甚至可能更快.看看这篇文章:"想要速度?通过价值." 但是,当您查看过去的Stack Overflow讨论时,您还会发现有经验的程序员反对这种观点.

就个人而言,我还没有下定决心.我认为C++ 11对我来说太新了,无法判断什么是好的和坏的.

然而,如果由于某种原因必须使用预C++ 11编译器,C++ 11通常是不相关的,因此在任何情况下都必须知道前C++ 11规则.

  • "想要速度?通过价值传递"的问题在于它将通过签名表达的意图与实施细节混为一谈.如果该函数不会修改参数,则可以使用value或const-reference; 但是,当函数从不首先需要时,引入副本是浪费.因此,当函数需要副本时,您应该使用pass-by-value ...但这意味着实现细节会泄漏到签名中,因此如果您更改了实现,则可能需要查看签名urk. (4认同)