专栏首页C++核心准则原文翻译C++核心准则:C.164:避免隐式转换运算符

C++核心准则:C.164:避免隐式转换运算符

C.164: Avoid implicit conversion operators

C.164:避免隐式转换运算符

Reason(原因)

Implicit conversions can be essential (e.g., double to int) but often cause surprises (e.g., String to C-style string).

隐式转换可以很重要(例如,double转换为int),但经常会带来意外的结果(例如,String转换为C风格字符串)。

Note(注意)

Prefer explicitly named conversions until a serious need is demonstrated. By "serious need" we mean a reason that is fundamental in the application domain (such as an integer to complex number conversion) and frequently needed. Do not introduce implicit conversions (through conversion operators or non-explicit constructors) just to gain a minor convenience.

优先采用显式命名转换,直到发现必须重视的需求。我们通过“必须重视的需求”来表达在应用领域中非常本质(例如整数到复数的转换)且经常遇到的原因。不要因为很小的便利而(通过转换运算符或者非显式构造函数)引入隐式转换。

Example(示例)

struct S1 {
    string s;
    // ...
    operator char*() { return s.data(); }  // BAD, likely to cause surprises
};

struct S2 {
    string s;
    // ...
    explicit operator char*() { return s.data(); }
};

void f(S1 s1, S2 s2)
{
    char* x1 = s1;     // OK, but can cause surprises in many contexts
    char* x2 = s2;     // error (and that's usually a good thing)
    char* x3 = static_cast<char*>(s2); // we can be explicit (on your head be it)
}

The surprising and potentially damaging implicit conversion can occur in arbitrarily hard-to spot contexts, e.g.,

意外的、具有潜在破坏的隐式转换可能在任何时候发生,而且难于发现。

S1 ff();

char* g()
{
    return ff();
}

The string returned by ff() is destroyed before the returned pointer into it can be used.

被ff()返回的string对象会在返回的指针被使用之前被销毁。

Enforcement(实施建议)

Flag all conversion operators.

提示所有的转换运算符。

原文链接:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c164-avoid-implicit-conversion-operators


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

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

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

原始发表时间:2020-03-01

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则C.152:永远不要将派生类数组的指针赋值给基类指针

    Subscripting the resulting base pointer will lead to invalid object access and p...

    面向对象思考
  • C++核心准则​T.123:使用常量表达式函数在编译时求值

    T.123: Use constexpr functions to compute values at compile time

    面向对象思考
  • C++核心准则T.65:使用标签分发提供函数的不同实现

    T.65: Use tag dispatch to provide alternative implementations of a function

    面向对象思考
  • 受限玻尔兹曼机(RBM)原理总结

    地址:http://www.cnblogs.com/pinard/p/6530523.html

    机器学习算法工程师
  • 4.OpenStreetMap Data Model

    XML文件包含几个元素类型,这些元素类型对您要编写的代码很重要:节点、方式和关系。

    小飞侠xp
  • 原生支付 SDK 技术回顾

    君赏
  • TCN: 端到端机器人自学习算法

    Time-Contrastive Networks: Self-Supervised Learning from Multi-View Observation

    用户1908973
  • TCN: Self-Supervised Learning from Multi-View Observation

    Time-Contrastive Networks: Self-Supervised Learning from Multi-View Observation

    用户1908973
  • 第一轮返工潮,哪些城市疫情传播压力最大

    内容提要:从 2 月 10 日起,多个省份开始正式复工。但在疫情尚未解除警报之时,返工潮带来的人员流动,未免给人口迁入大省造成病毒输入压力。对此,利用大数据分析...

    HyperAI超神经
  • day33_Spring学习笔记_01

    4 + 1:4个核心jar包(beans、core、context、expression)+ 1个依赖jar包(com.springsource.org.apa...

    黑泽君

扫码关注云+社区

领取腾讯云代金券