我怎样才能找到应该是const的C++函数?

use*_*186 4 c++ g++

我有这个代码:

#include <stdio.h>

class A
{
public:
  int doit()
  {
    return 5;
  }
  int doit2() const
  {
    i++;
    return i;
  }
  int i;
};

int main()
{
  A a;
  printf("%d\n", a.doit() );
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

用g ++ -Wall -Wpedantic main.cpp完全编译.有没有办法让g ++说"A :: doit()应该标记为const"?g ++ 4.8有-Wsuggest-attribute = const但在这种情况下似乎不起作用.g ++ -Wall -Wpedantic -Wsuggest-attribute = const const_main.cpp -fipa-pure-const -O2 -Wextra仍然很干净.

我同意const是一个设计决策,但我正在处理的是许多遗留代码行的情况,如果const函数被标记为这样,那么新的开发人员将会有所帮助.我认为编译器知道的足够多,因为如果我将一个函数标记为const然后修改状态,它将引发错误.我只是要求与之相反,以便我可以将const函数标记为const并且我甚至不需要它完美并找出真正复杂的情况,我会满足于我的简单情况在上面的代码中概述.

现在我添加了一个非const函数doit2(),但声明为const,编译器说:

const_main.cpp: In member function ‘int A::doit2() const’:
const_main.cpp:12:6: error: increment of member ‘A::i’ in read-only object
     i++;
      ^
Run Code Online (Sandbox Code Playgroud)

我只需要与之相反(告诉我什么时候它可能是const,但它没有标记为这样).

在这里找到答案: Const正确性警告c ++

Ton*_*roy 5

否.设计界面不仅仅是允许当前的行为 - 它还涉及保留自由和表达限制,因此客户端代码不会因未来对类代码的更改而破坏.这不是合理的海湾合作委员会希望doit() 应该const,因为一些打算或设想的代码可能要求它非进化const......你们的责任是这样的设计决策.测试用例可以帮助确保允许进行预期的操作,但是测试用例将反映出您的客户端使用的设计决策,而不是编译器决定的事情.

一个非常简单的例子是一个具有初始实现ala的函数throw Not_Implemented();- throw建议不需要非const,但如果函数请求的逻辑操作最终实现并且需要更改可观察对象状态,那么它应该不是最初的标记const. std::string::shrink_to_fit()是一个类似的例子 - 它可能是空的,因此可能const在未实现时(标准表示它是非绑定请求),但应该是非的,const因为在实现时它会更改对象的可观察状态(例如,在操作期间的未来迭代器失效)现在可以触发更早的resize()).