非成员函数是否可能返回const值?
Is it possible for a non-member function to return a const value?
如果有,怎么做?这个问题有意义吗?
在我的例子中,让调用者修改返回的对象是没有意义的,所以我想把它标记为不可修改的。
const MyClass foo();
是有效的,但返回const值没有意义-它无论如何都会被复制。
您可以返回例如const引用:const MyClass & foo();
也是完全有效的。但这并不妨碍用户进行复制。
如果你考虑的是const MyClass * foo();
,那么const更有意义-用户将无法修改指向MyClass
的实例
这是可以做到的,但不一定有很大的意义。如果你按值返回一些东西,调用者收到的是你返回的内容的临时副本,所以他们通常无论如何都不能修改它。
当你返回一个引用时,它更有意义;如果(例如)您通过引用接收某项内容,并返回对该内容的引用,那么如果您接收到的内容是const限定的,那么您可能希望对返回的内容进行const限定。这通常意味着为const/非const形参重载函数,每个形参都有匹配的返回类型。
编辑:这可以处理(例如)C中出现的strstr
和strchr
等函数的问题,这些函数接受const限定的指针,但返回指向不 const限定的相同数据(字符串,在这种情况下)的指针。在C语言中,这些类型在类型系统中形成了一个漏洞,您可以在没有任何(可见的)强制转换的情况下意外地修改(或至少尝试修改)打算为const的内容。
char *s = strchr("Mystring", 'i');
*s = 'b'; // UB
相关文章:
- 从函数返回const char*数组
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 从类方法返回 "const char*" 作为 std::string&
- 为什么const rvalue合格的std ::可选:: value()返回const rvalue参考
- 通过移动分配从算术运算符过载中返回const值
- 从本机代码返回"const char*"并在java中获取"字符串"
- 为什么我的C 函数拒绝返回const引用
- 通过参考返回和const函数返回const值的函数之间的差异
- 如果我返回const定义的对象,为什么const关键字被取消资格
- 返回const lvalue引用rvalue临时?为什么这项工作
- 内置类型的返回const值
- 返回 const std::string*& from a std::string *tab[11]
- 如何在静态方法中返回const类型
- 返回const引用和非常数成员函数调用
- 为什么不允许我将函数返回 const char* 的结果分配给 char*,bt 可以将字符串文字(常量)分配给 cha
- 在 C++ 中返回 const 字符串引用的字符串文本
- 为什么我们必须从一元前缀运算符重载返回 const 引用
- 在返回 const 错误的函数中传递值
- 为什么我可以将返回 'const T&' 的函数的返回值分配给 'T' 变量,而不是 'T&' 变量?