标准::矢量的概念和GCC实现

Concept and GCC implementation of std::vector

本文关键字:GCC 实现 标准      更新时间:2023-10-16

让我们尝试创建一个类似指针的类型匹配两个随机访问迭代器和 NullablePointer 概念。此处的目标是创建自定义分配器为了将 std::vector 与我们的指针类类型一起使用。您可以在此处找到代码段

尝试编译此代码时出现问题:

int main()
{
     std::vector<float, allocator<float>> t {0.f, 0.f};
}

我们收到以下错误消息:

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:173:6: error: 
  value of type 'pointer' (aka 'ptr_like<int>') is not contextually convertible
  to 'bool'
    if (__p)

在这里,我们看到我们的类型必须是布尔可转换的。这并不难做到,如果人们有我们的指针类型的实例,他们很可能会像这样使用它。因此,让我们这样做并将以下内容取消注释到我们的代码片段中:

// In detail::ptr_like we add :
operator bool() const;

我们得到以下错误 clang :

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:168:25: error: 
  conditional expression is ambiguous; 'pointer' (aka 'ptr_like<int>') can be
  converted to 'int' and vice versa
  { return __n != 0 ? _M_impl.allocate(__n) : 0; }

Clang的错误向我们展示了为什么我们在这里遇到麻烦。现在我找到的唯一可行的解决方案如下:

    请求
  • c++11 时,将0替换为 c++11 关键字nullptr
  • 0替换为指针类型的强制转换static_cast<pointer>(0)
  • 更新分配器概念中指针的概念要求。
  • 不使用带有std::initializer_list的构造函数(悲伤)

在C++中定义自定义指针是错误的吗?

这是一个错误吗?

扩展我的评论。

{ return __n != 0 ? _M_impl.allocate(__n) : 0; }

第一个结果可以转换为bool int。第二个结果可以转换为 int 。这与将第二个结果转换为pointer一样好,因此它是模棱两可的。

但是我们不希望bool转换在这里可用,因此我们可以使其explicit 。正如我在这里描述的那样,它仍然在逻辑条件等情况下可用。上下文可转换为bool是该标准对满足NullablePointer要求的自定义指针类型设置的另一个条件(自 2011 年起 - 请参阅 17.6.3.3/3)。

我建议将转换运算符定义为显式的。例如

explicit operator bool() const;