【问题标题】:Compiler warning when a class breaks rule-of-three (five)类违反三规则时的编译器警告(五)
【发布时间】:2016-12-07 11:51:10
【问题描述】:

当一个类违反三规则(或五规则)时是否可以触发编译器警告?

此功能听起来很容易实现,并且在安全关键软件中非常有用,但我在文档或 Google 搜索结果中的任何地方都找不到它。

【问题讨论】:

  • 这可能是理想主义的哗众取宠,但恕我直言,最好以永远不需要实现三规则或五规则所需的功能的方式构建您的类。
  • @Bathsheba 绝对同意。如果您没有使用零规则,那么您的代码没有充分分解。
  • 我个人不希望检查规则五,因为我不确定这是一个好的指导方针。请查看 Howard Hinnant 的讨论:stackoverflow.com/a/38687106/1989995
  • 零规则很棒,但只有在人们在其他地方遵循五规则时才有效。最终必须有人实现特殊的成员函数。

标签: c++ c++11 gcc compiler-flags


【解决方案1】:

您可以将编译器标志-Weffc++ 用于 GCC

【讨论】:

  • -Weffc++ 确实发现了一些有趣的问题,但没有发现“五规则”违规。我正在使用来自 gcc-8-branch 的当前 gcc。当前的clang也没有。
  • 附议。 -Weffc++ 不明白这个
【解决方案2】:

clang-tidy 可以捕捉到这样的错误。鉴于此文件:

// badstyle.cpp
class Type {
  Type(const Type&) { }

  ~Type() { }
};

还有这个命令:

$ clang-tidy badstyle.cpp -checks=cppcoreguidelines-*

我的输出是:

badstyle.cpp:2:7: warning: class 'Type' defines a non-default destructor and a 
copy constructor but does not define a copy assignment operator, a move constructor
or a move assignment operator [cppcoreguidelines-special-member-functions]
class Type {
  ^

【讨论】:

    【解决方案3】:

    Visual Studio 2017 RC states 有一些“用于执行 C++ 核心指南的检查器”。由于“五法则”是最容易检查的规则之一,我相信它已经得到实施。

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      相关资源
      最近更新 更多