gpt4 book ai didi

函数参数的 C++ 所有权

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:58 29 4
gpt4 key购买 nike

我写了一个具有这种形式的函数:

结果 f(const IParameter& p);

我的意图是这个签名将明确表明函数没有取得参数 p 的所有权。

问题是 Result 将保留对 IParameter 的引用:

class Result
{
const IParameter& m_p;

public:
Result( const IParameter& p )
: m_p( p ){ }
};

但后来碰巧有人这样调用函数:

const auto r = f(ConcreteParameter{});

不幸的是,临时文件可以绑定(bind)到 const 引用,这导致了崩溃。

问题是:我怎样才能明确该函数不应该用临时对象调用,并且当发生这种情况时可能会出现一个很好的编译错误?在这种情况下声明它没有取得所有权实际上是错误的,因为将它传递给将在函数调用范围之外传播的结果吗?

最佳答案

最简单的表达方式是使用右值引用参数重载函数。对于临时对象,它们比 const 引用更受欢迎,因此将选择它们。如果您随后删除上述重载,您将得到一个不错的编译器错误。对于您的代码,它看起来像:

Result f( const IParameter&& ) = delete;

你也可以对 Result 做同样的事情来观察它,它看起来像:

class Result
{
const IParameter& m_p;

public:
Result( const IParameter& p )
: m_p( p ){ }
Result( const IParameter&& ) = delete;
};

关于函数参数的 C++ 所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56651525/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com