【发布时间】:2011-04-16 20:23:55
【问题描述】:
如果是这样,怎么做?这个问题还有意义吗?
在我的情况下,调用者修改返回的对象是没有意义的,所以我想将它标记为不可修改。
【问题讨论】:
如果是这样,怎么做?这个问题还有意义吗?
在我的情况下,调用者修改返回的对象是没有意义的,所以我想将它标记为不可修改。
【问题讨论】:
const MyClass foo(); 是有效的,但返回一个 const 值没有意义 - 无论如何它都会被复制。
您可以返回例如一个常量引用:const MyClass & foo(); 也是完全有效的。但这并不妨碍用户制作副本。
如果您正在考虑 const MyClass * foo();,那么 const 更有意义 - 用户将无法修改指向 MyClass 的实例。
【讨论】:
可以做到,但不一定有意义。如果您按值返回某些内容,调用者收到的是您返回的内容的临时副本,因此他们通常无法修改它。
当您返回参考时,它会更有意义;如果(例如)您通过引用收到某些内容,并返回对相同内容的引用,那么如果您收到的内容是 const 限定的,则您可能希望对返回的内容进行 const 限定。这通常意味着为 const/non-const 参数重载你的函数,每个参数都有匹配的返回类型。
编辑:这可以处理(例如)在 C 中使用 strstr 和 strchr 等函数出现的问题,它们采用 const 限定指针,但返回指向相同数据的指针(字符串,in这种情况)是非 const-qualified。在 C 语言中,这些在类型系统中形成了一个漏洞,您可以在其中意外地修改(或至少尝试)一些本来应该是 const 的东西,而无需任何(可见的)强制转换。
char *s = strchr("Mystring", 'i');
*s = 'b'; // UB
【讨论】: