当类违反三五法则时,编译器会发出警告

5

当一个类违反三五法则时,是否可能触发编译器警告?

这个特性听起来很容易实现,在安全关键软件中非常有用,但我在文档或谷歌搜索结果中找不到它的任何信息。


2
这可能是理想主义的废话,但在我看来,更好的做法是以这样的方式构建你的类,使得你永远不需要实现规则三或规则五所需的函数。 - Bathsheba
@Bathsheba 绝对同意。如果您未使用零规则,则代码分解不足。 - Richard Hodges
1
我个人不想检查五法则,因为我不确定它是否是一个好的指导方针。请查看Howard Hinnant的讨论:https://dev59.com/HVkT5IYBdhLWcg3wX-hp#38687106 - alexeykuzmin0
零规则很好,但只能起作用是因为其他地方的人们遵循了五个规则。最终还是有人必须实现特殊成员函数。 - Ryan Haining
3个回答

5

您可以在GCC中使用编译器标志-Weffc++,该标志与C++代码的有效性和可读性有关。


1
Weffc++发现了一些有趣的问题,但它无法找到“五个规则”的违规行为。我正在使用来自gcc-8-branch的当前gcc。当前版本的clang也不行。 - proski
1
赞同。-Weffc++ 没有捕获到这个。 - Ryan Haining
1
使用该标志进行干净编译的示例。 - Ryan Haining

3

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 {
  ^

2
Visual Studio 2017 RC 状态将具有一些“强制执行C ++核心指南的检查器”。由于“五个规则”是最容易检查的规则之一,我相信它已经实现了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接