对于stackoverflow上的类似问题有一些答案,但所有这些都是不完整的或没有比较(使用不同的示例)。我看到至少3种可能的声明案例:
const void f();
void f() const;
const void f() const;
他们之间有什么区别?
我发现的唯一区别是以下代码仅适用于(2)或(3):
const foobar fb;
fb.foo();
答案 0 :(得分:7)
const
将返回类型声明为const
。const
仅适用于成员函数,表示该函数不能/不会修改任何成员非mutable
变量(对象常量)。答案 1 :(得分:3)
方法名称之前的const
(如第1点,以及问题的第3点)是指返回类型。这意味着函数的结果是不可修改的;但是这个const实际上有意义的时候是有限的 - 基本上,它通常只对用户定义的类型有意义。但是在void
返回类型的上下文中它意味着什么,我现在还不知道。我最好的猜测是它被编译器忽略了。
方法名称后面的const
(如第2点和第3点所示)使整个方法成为常量,这意味着该方法可能不会修改任何成员(除了声明的mutable
)。
由于您的foobar
变量被声明为const
,因此可能无法修改,因此只能调用const
个方法,这就是为什么只有2.和3.工作(它们都是声明方法 const
;在1.它只是返回类型是const!)
答案 2 :(得分:1)
1) const void f();
将返回类型称为常量。在模板中的示例中很有用,其中忽略了void
上的cv资格或者在编译器实现和最终用户代码方面使它们成为错误could create unnecessary complexity。例如:
template<typename T>
const T ...
函数的返回值是右值。 non-const
类型的Rvalues不是 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的东西。这就是为什么只能在常量对象上调用这样的函数
const foobar fb;
fb.foo(); // OK
但是
void f();
const foobar fb;
fb.foo(); // error
最后
3) const void f() const;
以上两者
答案 3 :(得分:1)
通常,const
会修改它前面的内容(和
应该在它修改之后立即写入)。
在您显示的案例中:
const void f();
const被忽略。不要写这样的东西;它让人困惑 读者。
void f() const;
这声明了一个“const”函数(因为const
是
紧接着是函数声明。的概念
const函数有点特殊:它只适用于
非静态成员函数,它表示类型
this
将是T const*
,而不是T*
。在实践中,它是
作为承诺不修改可观察状态
对象函数被调用。
const void f() const;
与先例完全相同。第一个const
是
忽略。
当然,还有许多其他地方const
可以出现:
void const* f();
例如,声明一个返回指针的函数 一个空洞。 (您经常会将其视为
const void* f();
如果const
之前没有任何内容,那么它适用于什么
如下。但是,作为一般规则,最好避免
这种风格,即使它非常普遍。)
请注意您与第一篇文章的区别
例。这里,返回类型是一个指针,const
适用于指向的内容,而不是指针(指针)
是void *const
)。虽然忽略了顶级const
非类返回类型(因此void *const f();
与...相同
void* f();
),对于其他const, 为真。
答案 4 :(得分:0)
在某些情况下会使用const
关键字(包括您询问的关键字以及更多关键字)
<强> 1。声明的常量
const int constant_variable = 2;
在为值赋值后,不能更改常量变量(上例中的constant_variable
)值。
2.常规会员职能
Class Foo { int a_member_func()const; int a_member_variable; mutable int mutable_variable; };
禁止常量成员函数更改其对象的成员变量。在这种情况下,a_member_func()
不允许更改a_member_varialbe
,但特殊情况是常量成员函数可以更改标记为mutable
的成员变量的值(a_member_func()
可以更改{{ 1}})
3.Const参考参数和Const指针参数
int a_func(const int&amp; a,const int * b);
在这种情况下,mutable_variable
不允许更改a_func()
和a
的值。常量引用参数和常量指针参数不能通过它们传递给的函数来改变。
4.常量返回类型函数
const int a_func();
在函数返回类型前面使用的常量函数(b
关键字)总是返回一个常量值。这意味着const
返回一个常量值。
这不是const关键字用法的完整列表。