在概念上不将成员函数标记为const

Hum*_*awi 8 c++ const c++11

据我所知,const应尽可能使用.但是,我有一个总是困扰我的案例.

我是否应该将成员函数标记为const不更改任何成员变量值但它在概念上不是const函数?

例如:

class Engine{
public:
    int status;
};

class Car{
public:
   void start() const{
        engine_->status = 1;
    }
private:
    std::unique_ptr<Engine> engine_;
};
Run Code Online (Sandbox Code Playgroud)

编译器将接受const的const,start()因为engine_指针没有改变.然而,至少IMO似乎是不切实际的,在一个被称为start类的函数中调用的函数Carconst一个!

这个例子只是一个快速的例子.通常,Car应该更新类的某些内部状态,使const关键字不可行.然而,迷你的例子只是为了说明我的想法.

Nic*_*las 14

函数是否应该是一个简单的度量标准const:

Type a{...};
Type b{...};

bool comp1 = a == b;

b.some_func(...);

bool comp2 = a == b;
Run Code Online (Sandbox Code Playgroud)

如果comp1comp2永远是不同的,那么some_func是不是const.

显然,并不是每种类型都有operator==过载,但大多数都至少有一个概念性的想法,即你要测试它们是否相等.Car具有不同engine状态的不同实例将是不相等的.因此,改变engine状态的功能不是const.

  • 假设`Type`是一个`int&`.然后你的代码(用底层`int`上的变异操作替换`some_func`)可能会失败.即使操作修改了底层引用对象,引用语义类型(视图)也可以是`const`,并且`==`可以比较底层对象而不是引用引用的标识.或者,简而言之,`std :: reference_wrapper <T>`. (2认同)

Sla*_*ica 5

在你的情况下,编译器允许你start()通过指针不完美地传播const 来制作const.如果用类型对象替换指针,Engine问题就会消失.所以答案是否定的,不应该const在这种情况下使用Engine智能指针或实例是内部细节,不应该影响类的公共接口Car.

至于我在这里和那里阅读,应尽可能使用const.

这种说法过于笼统,并且与任何通用建议一样,不应在每种情况下正式使用.