如果我有这样的 fnc:
void fnc(const SomeType&){/**/}
当我列出这个 fnc 的前置条件和后置条件时,我认为列出以下形式的前置条件:
SomeType must be of a correct type是相当愚蠢的,不是吗?我要求这样做是因为在我的大学里,他们希望我们列出这样的内容,但是如果 arg 的类型不正确,则代码无论如何都不会编译,所以我认为拥有这种形式的先决条件是错误的。但像往常一样,我错了。
如果我有这样的 fnc:
void fnc(const SomeType&){/**/}
当我列出这个 fnc 的前置条件和后置条件时,我认为列出以下形式的前置条件:
SomeType must be of a correct type是相当愚蠢的,不是吗?我要求这样做是因为在我的大学里,他们希望我们列出这样的内容,但是如果 arg 的类型不正确,则代码无论如何都不会编译,所以我认为拥有这种形式的先决条件是错误的。但像往常一样,我错了。
不要说显而易见的。
正如您所说,如果类型不匹配,代码显然不会编译。
前置条件和后置条件将取决于函数试图做什么。
如果您的老师要求您添加此类注释,则可能不适用于简单的情况,因为此类注释只是愚蠢的并且无论如何都已由编译器验证。
但在某些情况下,算法中定义的形式类型可能比 C++ 中使用的实现类型更具限制性。在这种情况下,这种评论可能会有一些用处。
另一个有用的案例是基于注释的自动生成文档,但是文档系统应该能够自己从函数原型中提取该信息。
我会这样说:
第一个参数应该是 type
SomeType
,或者可以转换为它。
编译器是否可以检查它并不重要。如果可以从函数的签名中设计出一些先决条件,那并不意味着这些东西不是先决条件。阅读前提条件后,用户应该能够编写可以正确编译和运行的程序。
发表这样的评论是愚蠢的——我同意。评论应该提供一些有用的信息。
先决条件列表应该说明为了运行该功能必须满足什么。后置条件列表应该说明函数退出时必须满足的条件。您可以通过三种方式检查这些条件:
您还可以将模板参数列表添加到函数注释中,如果它们不符合要求,则编译失败。