gpt4 book ai didi

c++ - 资源句柄常量正确性

转载 作者:行者123 更新时间:2023-12-04 07:33:30 25 4
gpt4 key购买 nike

我有时在理解常量正确性时遇到问题,尤其是当它是对象的逻辑常量时。假设我有一个类是某个资源的句柄。如果它是一个常量句柄,那么我不想允许通过它修改资源。它不拥有此资源,它有点像它的“ View ”。如果我复制它,我不会创建新资源。

template<typename T>
class Handle
{
private:
T *res = nullptr; // just placeholder value...

public:
//constructors and other code...

const auto& getRes() const {return *res;}
auto& getRes() {return *res;}

};
在这里,我有一个问题。如果我从这个常量句柄制作一个非常量拷贝,我可以修改资源。
void func(const Handle<int>& res)
{
//res.getRes() = 10; // Error. good.
auto res_copy = res;
res_copy.getRes() = 10; // Not good.
}
我只是假设如果我将某些东西作为常量传递给函数,那么我应该能够以某种方式强制执行这种逻辑常量。或者也许我想错了。我知道标准库使用诸如 const-iterator/iterator 或 string-view 之类的东西,它们始终是 const 但不知道如何将其应用于这种情况。
我可以做一个 ConstHandle或转换 Handle<int>Handle<const int>但随后我必须在函数中指定句柄的常量性和资源的常量性,例如:
void func(const Handle<const int>& res)
如果我只想传递一个 const auto& handle,也许它不会很好地工作。到函数,或 const HandleType概念。也许我想多了,但我只想在我的脑海中解决这个问题。

最佳答案

I just assume that if I pass something to a function as const, then somehow I should be able to enforce this logical constness.


这可能会导致令人惊讶的行为或无法执行的常量。正如您所注意到的,您只需复制句柄即可获得可变句柄。
这与不指向 const 数据的 const 指针存在相同的问题。
我建议您遵循标准对 std::span 所做的工作.您需要使用 std::span<const int>如果您希望数据为常量。
在你的情况下,那确实是 Handle<const int>如果您想对该句柄指向的事物强制执行常量性。

你也可以有一个 ConstHandle ,但由于您已经有一个模板参数来指定 T ,为了简单起见,我会使用它。为了便于使用,您还可以这样做:
template<typename T>
using ConstHandle = Handle<T const>;

关于c++ - 资源句柄常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67842004/

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