什么时候应该在 C++ 构造函数参数中使用 const?

When should I use const in C++ constructor parameters?

我对 clean code/coding 风格有疑问,问题是,我什么时候应该在 C++ 构造函数参数中使用关键字 const。例如,考虑以下 class:

class A {
    public:
    B& b;
    explicit A (const B& b_): b(b_) {}
    };

在这段代码中,我想从classA初始化引用b,同时,我想表达引用作为参数传递class A 构造函数将不会用于更改对象 b_ 的值。但是,提供的代码不会编译,编译器会显示消息:

"error: binding reference of type ‘B&’ to ‘const B’ discards qualifiers"

我知道我可以在 b class 属性中使用关键字 const,但是,它会使属性保持不变,我不想将此约束强加于属性。所以,我想知道在这种情况下我该怎么办。

I want to express that the reference passed as a parameter to the class A constructor will not be used to change the values of the object b_.

但事实并非如此。可以修改传递给 A 的构造函数的引用。不是 必须 直接由 A 的构造函数,而是 A 的任何其他修改对象的成员函数。

如果函数通过 const& 获取参数,则该函数的调用者有权期望该对象不会被该函数或任何进程修改 dependent 在该函数的执行上。例如在构造函数中初始化一个引用成员,可以在该构造函数执行后访问。

你应该做的是不要欺骗用户。 A 的构造函数的一个依赖结果是传递给它的参数可能会被修改。所以它应该是一个非const参考。

同样重要的是,创建 A 的行为从根本上取决于给定对象 在构造函数退出后继续存在 。由于 const& 参数可以绑定到临时参数,因此有人很容易像这样调用您的构造函数 A a(B{})a 在这条语句之后引用了一个已经被销毁的对象。如果您的函数采用非 const 引用,这将是一个编译错误。