【问题标题】:Adding const-ness after the fact in C++ [duplicate]在 C++ 中添加 const-ness [重复]
【发布时间】:2010-09-15 16:53:34
【问题描述】:

可能重复:
Is there some ninja trick to make a variable constant after its declaration?

考虑以下最小示例:

void MutateData(std::string&);

int main()
{
  std::string data = "something that makes sense to humans.";

  ::MutateData(data); // Mutates 'data' -- e.g., only changes the order of the characters.

  // At this point, 'data' should never be changed.
  // Mixing the above with const-correct code seems ugly.
}

目前,我正在做:

namespace
{
  std::string PrepareData(std::string data)
  {
    ::MutateData(data);

    return data;
  }
}

int main()
{
  const std::string data = ::PrepareData("something that makes sense to humans.");
}

在声明点之外模拟const有哪些优雅的解决方案?


编辑:我忘了澄清我不能轻松(不是我的代码)更改MutateData

【问题讨论】:

  • 这看起来像是stackoverflow.com/questions/3669315/…的副本
  • 谢谢。我知道应该已经有一个问题了。可惜发帖前没找到。
  • 有些主题很难搜索,没有找到它们也没有什么可耻的。在某些方面,您的标题优于之前的标题,这使其成为关闭但未删除的主要候选者,作为未来访问者面临相同搜索问题的路标。

标签: c++ constants const-correctness


【解决方案1】:

您可以使用 const 引用。
请查看 http://herbsutter.com/2008 以了解其工作原理。

【讨论】:

    【解决方案2】:

    怎么样:

    string MakeData(string const&)
    {
        ...
        return string(...);  // for return value optimization
    }
    

    紧随其后

    int main()
    {
        string const& str = MakeData("Something that makes sense to humans");
    }
    

    与您所做的不同之处在于使用 const 引用,并且只使用一个函数。如果您无法更改 MutateData,请执行您的建议(尽管使用 const 参考)

    【讨论】:

    • 与实变量相比,使用常量引用没有明显的优势。在变量的情况下,大多数编译器会省略额外的副本并在适当的位置构建返回对象。在引用版本中,编译器仍然需要保留临时(保留堆栈中创建返回值的空间)并可能创建引用(或避免创建它,因为引用是别名,它不需要创建一个但只需使用标识符来引用临时的,这正是返回值优化所做的)。
    • @David:你当然是对的,两者完全相同。但是 const 引用技巧非常地道......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多