【问题标题】:Is it possible for a non-member function to return a const value?非成员函数是否可以返回 const 值?
【发布时间】:2011-04-16 20:23:55
【问题描述】:

如果是这样,怎么做?这个问题还有意义吗?

在我的情况下,调用者修改返回的对象是没有意义的,所以我想将它标记为不可修改。

【问题讨论】:

    标签: c++ constants


    【解决方案1】:

    const MyClass foo(); 是有效的,但返回一个 const 值没有意义 - 无论如何它都会被复制。

    您可以返回例如一个常量引用:const MyClass & foo(); 也是完全有效的。但这并不妨碍用户制作副本。

    如果您正在考虑 const MyClass * foo();,那么 const 更有意义 - 用户将无法修改指向 MyClass 的实例。

    【讨论】:

    • 当然,still 并不能阻止调用者复制对象。而且它确实使调用者更难管理生命周期。
    【解决方案2】:

    可以做到,但不一定有意义。如果您按值返回某些内容,调用者收到的是您返回的内容的临时副本,因此他们通常无法修改它。

    当您返回参考时,它会更有意义;如果(例如)您通过引用收到某些内容,并返回对相同内容的引用,那么如果您收到的内容是 const 限定的,则您可能希望对返回的内容进行 const 限定。这通常意味着为 const/non-const 参数重载你的函数,每个参数都有匹配的返回类型。

    编辑:这可以处理(例如)在 C 中使用 strstrstrchr 等函数出现的问题,它们采用 const 限定指针,但返回指向相同数据的指针(字符串,in这种情况)是 const-qualified。在 C 语言中,这些在类型系统中形成了一个漏洞,您可以在其中意外地修改(或至少尝试)一些本来应该是 const 的东西,而无需任何(可见的)强制转换。

    char *s = strchr("Mystring", 'i');
    *s = 'b'; // UB
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 2015-06-10
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      相关资源
      最近更新 更多