为什么静态成员函数不能是常量?
Why can't static member functions be constant?
我浏览了关于这个主题的现有线程,但对解释不满意。
我能从那里学到的是:
当一个非静态成员函数被声明为const
时,限制是强加于这个this
指针。由于静态成员函数不涉及this
指针,因此不能将它们声明为const
。
是这样吗?对我来说听起来不太有说服力。我的意思是,我不是在质疑为什么会这样。我只想说出原因。
允许const
非静态成员函数修改局部、静态和全局变量;只是不允许通过this
指针修改其类的成员(隐式或显式)。因此,允许const
静态成员函数修改局部变量、静态变量和全局变量,就像修改非成员函数一样。这将使const
毫无意义。
如果你想编写一个根本不允许修改任何非局部变量的函数,你可以将其声明constexpr
,尽管这也施加了额外的限制。
函数的常量/非常量区别很重要的原因是,在某些情况下调用非常量函数是不合法的。因此,这种区别可以用来强制执行不变量。
例如,如果将非常量引用传递给函数,则如果类设计正确,则可以保证该函数无法更改引用所引用事物的值。这使您可以避免复制。
此外,非常量引用不能绑定到临时引用。这允许函数指示它们是通过引用返回值还是只获取值。如果由于意外创建了临时值而无意中忽略了返回值,则在编译时会收到错误。
这些都不适用于静态函数,因为没有上下文禁止您调用它们。因此,静态函数不存在这种区别的整个基本原理。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 为什么不能用常量表达式声明数组?
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 生成 constexpr 字符串表,不能产生常量表达式
- 为什么C++编译器不能做更好的常量折叠?
- 为什么右值不能绑定到非常量左值引用,除了写入临时无效的事实?
- 错误:'new'不能出现在常量表达式中
- 为什么我不能将常量左值引用绑定到返回 T&&&的函数?
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- 不能(隐式地)从字符**转换为常量字符**吗?
- 为什么作为返回类型的右值引用不能初始化非常量引用?
- 为什么我不能使用与"常量字符*"相同的"const int*"创建一个 int 数组?
- 为什么我不能将 op 结果乘以常量特征张量数组
- 为什么我不能将 2 个常量字符* 连接到 std::string?
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 为什么常量引用不能延长通过函数传递的临时对象的生存期?
- 为什么我们不能在声明之前使用预处理器 #define 常量