专栏首页C++核心准则原文翻译C++核心准则编译边学-F.17 输入/输出参数传递非常量引用

C++核心准则编译边学-F.17 输入/输出参数传递非常量引用

F.17: For "in-out" parameters, pass by reference to non-const(输入/输出参数传递非常量引用)

译者注:in-out指的是向函数传递输入信息的同时又从函数获取输出信息的参数。

Reason(原因)

This makes it clear to callers that the object is assumed to be modified.

向调用者明示该对象可能被修改。

Example(示例)

void update(Record& r);  // assume that update writes to r

Note(注意)

A T& argument can pass information into a function as well as out of it. Thus T& could be an in-out-parameter. That can in itself be a problem and a source of errors:

T&类型参数可以向函数传递信息也可以从函数获取信息。因此T&可以作为输入/输出参数使用。(但是如果运用不当,)它本身可能就是一个问题并且是错误的起因。

void f(string& s)
{
    s = "New York";  // non-obvious error
}

void g()
{
    string buffer = ".................................";
    f(buffer);
    // ...
}

Here, the writer of g() is supplying a buffer for f() to fill, but f() simply replaces it (at a somewhat higher cost than a simple copy of the characters). A bad logic error can happen if the writer of g() incorrectly assumes the size of the buffer.

代码中函数g()的编写者向f()提供一个缓冲区用于填充,但是f()简单地替换了它(其代价稍高于简单的字符串拷贝)。如通过g()的编写者不正确地假设了buffer的大小,可能会导致非常不好的错误。

Enforcement(实施建议)
  • (Moderate) ((Foundation)) Warn about functions regarding reference to non-const parameters that do not write to them. (中等)((基本准则))当有函数将某引用视为非常量参数但又不去写它们的时候,报警。 译者注:如果只是用于输入信息,应该使用传值或者const类型。
  • (Simple) ((Foundation)) Warn when a non-const parameter being passed by reference is moved. (简单)((基本准则))当通过引用传递的非常量参数被移动的时候报警。 译者注:非常量参数意味着也会用于输出信息,如果内容被移动则无法继续使用。

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.84:不要定义无名局部变量

    ES.84: Don't try to declare a local variable with no name

    面向对象思考
  • C++核心准则CP.2:避免数据竞争​

    Unless you do, nothing is guaranteed to work and subtle errors will persist.

    面向对象思考
  • C++核心准则C.133:避免保护型数据成员‍

    protected data is a source of complexity and errors.protected data complicates t...

    面向对象思考
  • 实用手册:130+ 提高开发效率的 vim 常用命令

      Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs 并列成为类 Unix ...

    猿人谷
  • SAP C4C基于Thing Type和BO Object两种跳转方式介绍

    When I click the hyperlink in a given row in OWL, it is expected that the corres...

    Jerry Wang
  • 9 Top Reasons To Use A Testing Tool For Your Project Management.

    This article will guide you on how you can use a testing tool to reduce the time...

    Nick Karlsson
  • 呃哦:区块链可能没有我们想象的那么安全

    在对一百万份智能合约的分析中,一项新的分析工具发现34,200个安全漏洞。 在我们转向基于区块链的数字经济之前,我们需要解决这个系统中的缺陷。 ? 区块链有可能...

    首席架构师智库
  • SAP WebClient UI overview页面里assignment block的可见性分析技巧

    some assignment block is visible in design time ( the assignment block already a...

    Jerry Wang
  • ABAP开发的Github issue备份工具

    I personally prefer to use Github repository issue to manage my knowledge. For i...

    Jerry Wang
  • 如何将SAP C4C自定义BO中类型为图片的附件用PDF文档显示出来

    You have created your custom BO with attachment upload functionality available v...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券