专栏首页C++核心准则原文翻译C++核心准则ES.12:不要在嵌套作用域中重复使用同样的名称

C++核心准则ES.12:不要在嵌套作用域中重复使用同样的名称

ES.12: Do not reuse names in nested scopes

ES.12: 不要在嵌套作用域中重复使用同样的名称

Reason(原因)

It is easy to get confused about which variable is used. Can cause maintenance problems.

这会导致更难弄清楚到底哪个变量在使用。可能引起维护问题。

Example, bad(反面示例)

int d = 0;
// ...
if (cond) {
    // ...
    d = 9;
    // ...
}
else {
    // ...
    int d = 7;
    // ...
    d = value_to_be_returned;
    // ...
}

return d;

If this is a large if-statement, it is easy to overlook that a new d has been introduced in the inner scope. This is a known source of bugs. Sometimes such reuse of a name in an inner scope is called "shadowing".

这一个很大的if语句,很容易漏掉内部作用域引入了一个新变量d这个事实。这是有名的错误源之一。这种在内部作用域中重用名称的做法被称为“遮盖”。

Note(注意)

Shadowing is primarily a problem when functions are too large and too complex.

“遮盖”主要是在函数太大或者过于复杂时发生问题。

Example(示例)

Shadowing of function arguments in the outermost block is disallowed by the language:

处于最外侧的函数参数的遮盖问题是被语言禁止的。

void f(int x)
{
    int x = 4;  // error: reuse of function argument name

    if (x) {
        int x = 7;  // allowed, but bad
        // ...
    }
}
Example, bad(反面示例)

Reuse of a member name as a local variable can also be a problem:

重用成员名称作为局部变量同样会引起问题:

struct S {
    int m;
    void f(int x);
};

void S::f(int x)
{
    m = 7;    // assign to member
    if (x) {
        int m = 9;
        // ...
        m = 99; // assign to local variable
        // ...
    }
}
Exception(例外)

We often reuse function names from a base class in a derived class:

我们经常在派生类中重用基类的函数名:

struct B {
    void f(int);
};

struct D : B {
    void f(double);
    using B::f;
};

This is error-prone. For example, had we forgotten the using declaration, a call d.f(1) would not have found the int version of f.

这容易引发错误。例如,如果我们忘记using声明,调用d.f(1)时就无法发现f函数的整数版本。

??? Do we need a specific rule about shadowing/hiding in class hierarchies?

我们是否需要定义一个特别的适用于类继承情况下的遮盖/隐藏规则?

Enforcement(实施建议)

  • Flag reuse of a name in nested local scopes
  • 标记嵌套作用域中的名称重用。
  • Flag reuse of a member name as a local variable in a member function
  • 标记使用成员名称定义局部变量的情况。
  • Flag reuse of a global name as a local variable or a member name
  • 标记使用全局名称定义局部变量和成员名称的情况。
  • Flag reuse of a base class member name in a derived class (except for function names)
  • 标记派生类中重用基类名称的情况(函数名称除外)

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es12-do-not-reuse-names-in-nested-scopes

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

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

原始发表时间:2020-04-22

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则C.168: 将重载的运算符定义在操作对象的命名空间内

    C.168: Define overloaded operators in the namespace of their operands

    面向对象思考
  • C++核心准则CP.1: 设想你的代码​会成为多线程程序的一部分

    It's hard to be certain that concurrency isn't used now or won't be used sometim...

    面向对象思考
  • C++核心准则C.150:unique_ptr管理的对象要用make_unique()​构建

    make_unique gives a more concise statement of the construction. It also ensures ...

    面向对象思考
  • leetcode-645-Set Mismatch

    chenjx85
  • 解决Win10下H3C网络设备模拟器无法启动问题

    由于工作学习需要,需在win10上安装H3C网络设备模拟器,但无奈安装好后各种启动不起来。

    宋天伦
  • 谷歌新系统UI曝光,这是要把安卓大哥拉下马的节奏?

    镁客网
  • SwiftUI Core Data:使用约束确保对象是唯一的

    默认情况下,Core Data会添加您想要的任何对象,但这会很快变得混乱,尤其是当您知道两个或多个对象同时没有意义时。例如,如果您使用联系人的电子邮件地址存储了...

    韦弦zhy
  • python | 读文件编码问题 | UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 34: illegal mu

    其实,解决方案蛮简单,报错中提示了”gbk”编码问题,那么我们的编码会在哪些地方出问题呢?

    努力在北京混出人样
  • 估值超10亿 同行者牵手腾讯 加速车联网布局

    12月8日下午,深圳同行者科技与腾讯在深圳华侨城威尼斯酒店举办合作发布会,参会嘉宾包括腾讯车联网事业部总经理钟学丹、腾讯智能平台部总经理莫沙、微光创投创始人吴宵...

    云加社区
  • Open Baton起个大早,赶个晚集

    开源组织Open Baton在管理和网络编排(MANO)上研究的时间比其他开源MANO组织出现的时间都要早,那么为什么其他开源MANO组织如OSM和Open-O...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券