c++ - 从 const 函数返回非常量属性引用

标签 c++ reference

<分区>

这段代码有问题吗?

// Example program
#include <iostream>
#include <string>
#include <vector>

class A
{
public:
    A( std::vector<int>& ref ) : data(ref) {}

    std::vector<int>& getData() const { return data; }

private:
    std::vector<int>& data;
};

void modifyA( const A& a )
{
    a.getData().push_back(3);
}

int main()
{
    std::vector<int> foo;
    A a(foo);
    modifyA(a);
    std::cout << foo.size() << std::endl;
    std::cout << foo.front() << std::endl;
}

它看起来不错,但在使用类似方法部署更复杂的代码时,我在 Android 下遇到了未定义的行为。在某些时候,当通过这样的 getter ( shared_ptr 变为 NULL,而它根本没有被修改)。我还看到上面的程序在 http://cpp.sh 上返回了意外的值在某个时候但不一致。最后,我无法在 MVCE 中隔离问题...

我只是想知道从 const getter 返回对非常量成员的非常量引用是否可能是个问题。

最佳答案

这段代码很容易导致未定义的行为。根据您在评论中所说的,考虑这个例子:

struct B {
  std::vector<int> vec;
  A a;
  B() : vec{}, a{vec} {}
};

int main() {
  const B b;

  auto& vec = b.a.getData();

  vec.push_back(0);
}

我有一个常量对象,推而广之,它的所有成员都是常量。但是在这里,我得到了对这些 const 对象之一的非常量引用。没有警告,没有明显的丑陋类型转换。只是沉默的鼻恶魔。

即使所有权从来都不是问题,这也非常容易出错。

关于c++ - 从 const 函数返回非常量属性引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47661414/

相关文章:

c++ - 为什么 GCC 拒绝引用 std::optional?

c++ - 使用 Crypto++ 加密 RSA 私钥并将其写入文件

c++ - MS SQL 存储过程使用 ODBC 返回结果集

java - 使用线程更新 ArrayList 对象实例的好方法是什么?

reference - 引用如何在绑定(bind)表达式的模式中工作?

javascript - 数组文字作为对象键?

javascript - 从 Typescript 编译中排除引用?

c++ - 不能同时将 ascii 字符转换为 int 和 hex

c++ - 如何获得 high_resolution_clock 的精度?

C++ 不完整类型的分配