繁体   English   中英

std::vector 的概念和 GCC 实现

[英]Concept and GCC implementation of std::vector

让我们尝试创建一个与RandomAccessIteratorNullablePointer概念相匹配的类似指针的类型。 这里的目标是创建一个自定义分配器,以便将 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)

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

// 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 时用 c++11 关键字nullptr替换0
  • 0替换为指针类型static_cast<pointer>(0)
  • 更新分配器概念中指针的概念要求。
  • 不使用带有std::initializer_list的构造std::initializer_list (悲伤)

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

这是一个错误吗?

扩展我的评论。

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

第一个结果可以转换为boolint 第二个结果可以转换为int 这与将第二个结果转换为pointer一样好,所以它是不明确的。

但是我们不希望bool转换在这里可用,所以我们可以让它explicit 正如我在此处描述的那样,它仍然可以在逻辑条件等条件下使用。 在上下文中可转换为bool是标准放置在满足NullablePointer要求的自定义指针类型上的另一个条件(自 2011 年 - 见 17.6.3.3/3)。

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

explicit operator bool() const;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM