【问题标题】:Can I declare a non-member function const in C++?我可以在 C++ 中声明一个非成员函数 const 吗?
【发布时间】:2011-05-22 04:34:53
【问题描述】:

我可以在 C++ 中将非成员函数(可能是全局函数)声明为 const 吗?我知道 const 关键字实际上应用于成员函数中传递的隐式“this”参数。另外,由于只有成员函数遵循“thiscall”调用约定,所以可以将 const 应用于非成员函数吗?

抛开我试图通过声明非成员函数 const 来做的事情,编译器会因此报告错误吗?

【问题讨论】:

  • “抛开...” 我不明白它怎么能被抛在一边,真的。至于编译器会不会报错,不如试试
  • @Karl Knechtel:因为某些编译器(理论上)可以发出警告而不是错误,或者接受它作为扩展?
  • @Karl: gcc 有这个任务的__pure____const__ 属性,它们是属性,因为它们是非标准的。
  • @Matthieu,取决于你对“这个任务”是什么的理解。
  • @Karl:是的,很明显:)

标签: c++ oop function constants


【解决方案1】:

不,只有非静态成员函数可以是const 限定的。

您希望 const 非成员函数具有什么语义?如果您想强制函数不修改任何参数,只需通过 const 引用获取它们。

【讨论】:

  • 我假设他想让编译器确保全局(const)函数不会修改任何全局变量。也就是说,由于这个问题被标记为“c++”和“oop”——所以不要这样做。在有意义的地方拥有一个全局(或静态类成员)对象是可以的,但编写具有超出其类实例范围的副作用的函数并不是一个好主意。
  • 可以通过将每个形式参数限定为 const 来达到相同的效果,例如: int foo(const arg1, const arg2, ...) 表示,const for成员函数实际上是一种告诉隐式参数“this”是一个常量的方法。对于非成员函数,已经有办法在每个参数的函数声明中使用 const (如果喜欢的话)。此外,由于非成员函数中没有隐含的参数(如'this'),它没有意义。
【解决方案2】:

回答您的第二个问题:尝试对非成员(即 void foo() const; )使用成员函数语法是违反语法的。因此,编译器必须给出诊断——错误或警告。它可能不会默默地忽略const。但是,它可能会报告警告,然后假装const 不存在并生成可执行文件。

【讨论】:

  • 等等,允许编译器将语法违规(在我能想到的任何其他上下文中称为“语法错误”)降级为警告?
  • 是的。错误和警告之间的唯一区别是,如果编译器遇到错误,您将不会获得可执行文件。该标准仅涉及诊断,因为它不关心这种差异。例如。语法违规/语法错误“virtual ~Foo() = 0L;”可能会导致警告“必须将纯虚函数声明为 virtual ~Foo() = 0;”。
猜你喜欢
  • 2011-11-23
  • 2015-01-11
  • 2013-07-02
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2012-11-21
相关资源
最近更新 更多