gpt4 book ai didi

c++ - 为模板类重载 const 版本的 [] 运算符

转载 作者:行者123 更新时间:2023-12-03 04:45:05 25 4
gpt4 key购买 nike

关于在 C++ 中重载 [] 运算符的另一个问题,特别是其 const 版本。

根据cppreference page on operator overloading ,重载数组下标运算符时

struct T
{
value_t& operator[](std::size_t idx) { return mVector[idx]; }
const value_t& operator[](std::size_t idx) const { return mVector[idx]; }
};

If the value type is known to be a built-in type, the const variant should return by value.

因此,如果 value_t 恰好是内置类型,则 const 变体应该看起来

    const value_t operator[](std::size_t idx) const { return mVector[idx]; }

甚至可能

   value_t operator[](std::size_t idx) const { return mVector[idx]; }

因为 const 限定符对于这样的返回值不是很有用。

<小时/>

现在,我有一个模板化的类 T(以保持与引用相同的命名),它与内置数据类型和用户一起使用两者定义的,其中一些可能很重。

template<class VT>
struct T
{
VT& operator[](std::size_t idx) { return mVector[idx]; }
const VT& operator[](std::size_t idx) const { return mVector[idx]; }
};

根据上面给出的建议,我应该将 enable_if 与一些 type_traits 一起使用区分具有内置/非内置类型的模板化类实例化。

我必须这样做吗?此建议是否以避免对内置类型进行潜在的不必要的取消引用,或者其背后隐藏着其他需要注意的内容?

<小时/>

注释:

  • 此类积极参与使用内置类型和自定义类型实例化的代码的热门部分。
  • 代码跨平台使用多个编译器,并具有不同程度的优化选项。
  • 因此,我有兴趣使其既正确又可移植,并避免任何潜在的性能损害。
  • 我无法在 C++ 标准中找到任何额外的推理,但阅读 standardeze 并不是我的强项。

StackOverflow 上的现有问题:

最佳答案

我不同意上述“建议”。考虑一下:

T t = /*Initialize `t`*/;
const T::value_t &vr = std::as_const(t)[0];
const auto test = vr; //Copy the value
t[0] = /*some value other than the original one.*/
assert(test != vr);

断言是否触发?它不应该触发,因为我们只是引用容器中的值。基本上,std::as_const(t)[i]应该与 std::as_const(t[i]) 具有相同的效果。但如果你的 const 则不然版本返回一个值。因此,进行这样的更改从根本上改变了代码的语义。

所以即使你知道 value_t是基本类型,您仍然应该返回 const& .

请注意,C++20 范围正式识别不返回实际 value_type& 的范围。来自他们的operator*或同等功能。但即便如此,这些东西仍然是该范围本质的基本组成部分,而不是基于模板参数而变化的属性(请参阅vector<bool>了解为什么这是一个坏主意的原因)。

关于c++ - 为模板类重载 const 版本的 [] 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59367316/

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