ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – std :: vector的概念和GCC实现

2019-08-25 12:08:17  阅读:229  来源: 互联网

标签:c-concepts c c11 pointers stdvector


让我们尝试创建一个类似指针的类型匹配
都是RandomAccessIterator
NullablePointer的概念.
这里的目标是创建自定义Allocator
为了使用std :: vector和我们类似指针的类型.你可以找到here的代码片段

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

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 convertible.这不难做到,
如果人们有我们的指针类型的实例,他们可能会像这样使用它.
因此,让我们这样做,并将以下内容取消注释到我们的代码段:

// 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)
>在Allocator概念中更新指针的概念要求.
>不使用带有std :: initializer_list的构造函数(悲伤)

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

这是一个错误吗?

解决方法:

扩展我的评论.

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

第一个结果可以转换为bool到int.第二个结果可以转换为int.这与将第二个结果转换为指针一样好,因此它是不明确的.

但我们不希望bool转换在这里可用,所以我们可以明确说明.它仍将在逻辑条件等中提供,正如我所描述的here.
上下文可转换为bool是另一个条件标准放置在满足NullablePointer要求的自定义指针类型上(自2011年起 – 见17.6.3.3/3).

标签:c-concepts,c,c11,pointers,stdvector
来源: https://codeday.me/bug/20190825/1718660.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有