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

时间:2014-08-28 02:02:36

标签: 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;
}

使用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++;
      ^

我只需要与之相反(告诉我它何时可能是常量但是没有标记为这样)。

在这里找到答案:Const correctness warnings c++

3 个答案:

答案 0 :(得分:5)

没有。设计界面不仅仅是允许当前的行为 - 它还涉及保留自由和表达限制,因此客户代码不会因未来对您的类代码的更改而中断。 gcc 期望 doit() 应该 const是不合理的,因为某些预期或设想的代码演变可能需要它是非const ...你有责任表达这个设计决定。测试用例可以帮助确保允许进行预期的操作,但是测试用例将反映您的关于客户端使用的设计决策,而不是编译器决定的事情。

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

答案 1 :(得分:1)

  

如何找到应该是const的C ++函数?

如果您正在更改thisclass)范围内的任何成员状态,那么这只是检测。同时公开允许更改类成员变量状态的引用或指针对const函数成员无效。

而且:不可以自动完成此操作,您必须手动将这些函数标记为const,并让编译器告诉您正文的代码是否违反此约束

答案 2 :(得分:0)

  

现在我添加了一个非const函数doit2(),但声明为const,编译器说:只读对象中成员'A :: i'的增量

这是因为您正在尝试修改const函数中的成员变量。 const函数是一个纯观察者函数,它不会改变对象的状态,因此当你尝试在这样的函数中改变状态时,编译器就会抱怨。

const函数内,所有成员变量,无论是否声明const,都将应用const限定符。此规则的例外是声明为mutable的那些。

相关问题