不幸的是,询问是否添加const是错误的问题.
将非const ref与传递非const指针进行比较
void modifies(T ¶m);
void modifies(T *param);
这种情况主要是关于风格:你想让呼叫看起来像呼叫(obj)或呼叫(& obj)?但是,差异有两点重要.如果您希望能够传递null,则必须使用指针.如果你正在重载运算符,则不能使用指针.
将const ref与值进行比较
void doesnt_modify(T const ¶m);
void doesnt_modify(T param);
这是一个有趣的案例.经验法则是“便宜复制”类型是通过值传递的 – 这些通常是小类型(但并非总是) – 而其他类型则由const ref传递.但是,如果你需要在你的函数中复制,你就是should pass by value.(是的,这暴露了一些实现细节.C’est le C.)
将const指针与非修改加过载进行比较
void optional(T const *param=0);
// vs
void optional();
void optional(T const ¶m); // or optional(T param)
这与上面的非修改情况有关,除了传递参数是可选的.这三种情况之间的差异最小,因此请选择最适合您生活的方式.当然,非const指针的默认值取决于您.
Const by value是一个实现细节
void f(T);
void f(T const);
这些声明实际上是完全相同的功能!当传递值时,const纯粹是一个实现细节. Try it out:
void f(int);
void f(int const) {/*implements above function, not an overload*/}
typedef void C(int const);
typedef void NC(int);
NC *nc = &f; // nc is a function pointer
C *c = nc; // C and NC are identical types