29 March 2022

C++ 核心指南目录

I.24: Avoid adjacent parameters that can be invoked by the same arguments in either order with different meaning

理由

两个相邻参数,如果类型相同,很容易顺序颠倒。比如

void copy_n(T* p, T* q, int n);  // copy from [p:p + n) to [q:q + n)

这是K&R C风格接口的一个讨厌的变体,数据目标和数据来源参数很容易颠倒。

把来源参数声明成 const 就比较容易识别他们的关系了。因为,我们复制的时候,一般不会去改变数据来源。

void copy_n(const T* p, T* q, int n);  // copy from [p:p + n) to [q:q + n)

例外

如果函数的计算过程不关心参数的顺序,那就不存在这个问题,就不需要 const 修饰了:

int max(int a, int b);

替代方案

不要用指针传递数组。可以通过 span 表示一个序列对象:

void copy_n(span<const T> p, span<T> q);  // copy from p to q

替代方案

定义结构体,用结构体的成员名表示相应的参数:

struct SystemParams {
    string config_file;
    string output_path;
    seconds timeout;
};
void initialize(SystemParams p);

因为调用的时候,要把参数填到带名字的成员变量中,这样可以明确参数的意义。

强化策略

  • (简单)如果出现连续两个相同类型的参数,警告。