stackoverflow 上有类似问题的一些答案,但它们都是不完整的或没有比较的(有不同的例子)。我看到了至少 3 种可能的声明案例:
- const void f();
- void f() const;
- const void f() const;
它们之间有什么区别?
我发现的唯一区别是以下代码仅适用于 (2) 或 (3):
const foobar fb;
fb.foo();
stackoverflow 上有类似问题的一些答案,但它们都是不完整的或没有比较的(有不同的例子)。我看到了至少 3 种可能的声明案例:
const void f();void f() const;const void f() const;它们之间有什么区别?
我发现的唯一区别是以下代码仅适用于 (2) 或 (3):
const foobar fb;
fb.foo();
const在这个位置声明返回类型为const.const在这个位置仅可用于成员函数,意味着该函数不能/不会修改任何成员非mutable变量(对象常量)。方法名称之前的A const(如您的问题的第 1 点和第 3 点)指的是返回类型。这意味着函数的结果是不可修改的;但是这个 const 何时真正有意义是有限制的——基本上,它通常只对用户定义的类型有意义。不过,在返回类型的上下文中它意味着什么void,我目前不知道。我最好的猜测是它只是被编译器忽略了。
方法名称后的A const(如第 2 点和第 3 点)使整个方法为 const,这意味着该方法不能修改任何成员(除了声明的mutable)。
由于您的foobar变量已声明const,因此可能无法修改,因此只能const调用其上的方法,这就是为什么只有 2. 和 3. 起作用的原因(它们都声明了方法 const;在 1. 中,只有返回类型是 const!)
通常,const修改它之前的内容(并且应该总是在它修改的内容之后立即写入)。在您显示的情况下:
const void f();
const 被忽略。不要写这样的东西;它使读者感到困惑。
void f() const;
这声明了一个“const”函数(因为const紧跟在函数声明之前。const 函数的概念有点特殊:它只适用于非静态成员函数,它意味着
thiswill的类型T const*,而不是在T*实践中,它被视为不修改调用函数的对象的可观察状态的承诺。
const void f() const;
和前面的完全一样。第一个const被忽略。
当然,还有很多其他地方const可以出现:
void const* f();
例如,声明一个返回指向 const void 的指针的函数。(你会经常看到这写成
const void* f();
如果前面没有任何内容const,那么它适用于后面的内容。然而,作为一般规则,最好避免这种风格,即使它非常普遍。)
请注意与您作为第一个示例编写的内容的区别。在这里,返回类型是一个指针,并且const
适用于所指向的内容,而不是指针(应该是void *const)。虽然顶级const在非类返回类型上被忽略(因此void *const f();与 相同
void* f();),但对于其他 const则不是这样。
1)    const void f();
将返回类型称为常量。在模板中的示例中很有用,其中忽略 cv 限定void或使其错误可能会在编译器实现和最终用户代码方面造成不必要的复杂性。例如:
  template<typename T>
  const T ...
函数的返回值是一个右值。类型的右值non-const不是cv-qualified,因此void const与简单的相同void-const在这种情况下被忽略。虽然const void不是很有帮助,const void*但是有它的用途。g++ 确认这const void可能很重要,因为以下代码无法编译
#include <type_traits>
static_assert(std::is_same<void(), const void()>::value, "const matters");
2)    void f() const;
指类成员。这个函数声明不更改类/结构的任何(非可变)成员,也不返回任何允许在不“破坏”常量的情况下修改它的东西。这就是为什么只能在常量对象上调用这样的函数
const foobar fb;
fb.foo();  // OK
但
void f();
const foobar fb;
fb.foo(); // error
最后
3)    const void f() const;
以上两者一起
在某些情况下使用const关键字(包括您询问的情况以及更多情况)
1. 声明的常量
常量 int 常量变量 = 2;
常量变量(constant_variable在上面的例子中)的值在被赋值后不能改变。
2.常量成员函数
类 Foo { int a_member_func()const; int a_member_variable;可变 int 可变变量;};
禁止常量成员函数更改其对象的成员变量。在这种情况下a_member_func()是不允许改变a_member_varialbe的,但特殊情况是常量成员函数可以改变成员变量的值,标记为mutable(a_member_func()可以改变mutable_variable)
3.Const引用参数和Const指针参数
int a_func(const int& a, const int* b);
在这种情况下a_func(),不允许更改a和的值b。常量引用参数和常量指针参数不能被它们传递给的函数更改。
4.常量返回类型函数
常量 int a_func();
一个常量函数(const函数返回类型前面使用的关键字),总是返回一个常量值。这意味着a_func()返回一个常量值。
这不是 const 关键字用法的完整列表。