【问题标题】:Returning data members of primitive types as a const reference?将原始类型的数据成员作为 const 引用返回?
【发布时间】:2012-09-10 13:59:38
【问题描述】:

示例:我有一个名为 Class 的类,它有一个数据成员 std::string m_nameint m_value

为了避免不必要的复制,我这样做了。

const std::string& Class::name() const;

为了使函数保持一致,对原始类型也可以接受吗?

const int& Class::value() const;

【问题讨论】:

  • 是什么让您认为您需要避免不必要的复制?
  • 基元在使用引用方面并没有任何优势,但您可能还是会得到 RVO。
  • @TonyTheLion:想象一下:c 类; std::cout
  • 老实说,我不明白你为什么会认为这甚至会带来问题?!!如果那里有副本,您认为问题是什么? (假设甚至有一个副本,编译器在适当的情况下非常擅长复制省略)

标签: c++


【解决方案1】:

对于您的 API 的用户来说,这不会有什么不同。 他的代码看起来像

Class c;
c.value(1940);
int x = c.value();

不管你怎么写。

如果您返回参考资料(您可能想要也可能不想要),他可能会做的一件事是

const int &x = c.value();
int &k = const_cast<int &>(x);
k++; // will change the internals of your object

这是你的选择。

【讨论】:

  • 老实说,const_cast 被放入语言中是有原因的。如果用户故意滥用它,那么如果事情停止正常工作,那不是你的问题。
  • @chris 仍然可以,如果您返回引用,则后者是可能的,它会正常工作。如果您返回一个值,它将不起作用!尝试在与安全相关的 dll API 中使用它,这对滥用者来说是一个开放的漏洞。
  • 没错,我的想法只是为用户提供一个有用的课程,而不是对安全性的重要强调。
猜你喜欢
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多