标准::矢量的概念和GCC实现
Concept and GCC implementation of std::vector
让我们尝试创建一个类似指针的类型匹配两个随机访问迭代器和 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;
相关文章:
- 理解GCC中的std::pow实现
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- 如何实现使用 gcc-4.4 编译的大向量初始化?
- 它是 gcc 中 std::valarray 实现的错误吗?
- 为什么仅 -fno-signed-0 就可以实现优化,而似乎也需要 -ffinite-math-only (gcc)
- GCC 如何实现 C++ 标准分配器
- 有没有比 GCC 或 Clang 实现更直观的方法来在 Linux 的C++中使用内联汇编
- std::chrono::d uration_cast - 是GCC实现的错误
- 在 gcc 上自己的元组实现段错误,同时在 clang 中工作
- 他们实现的开源C编译器(gcc,clang)的实际标准在哪里
- glibc函数的GCC、-flto、-fno内置和自定义函数实现
- 在哪里查找 GCC 实现定义行为的实现?
- GCC 看不到通过多重继承实现
- GCC 4.4 不实现 C++11 范围循环.它还支持哪些其他范围循环语法
- C++,我可以在其中找到 gcc 编译器标准库的实现文件
- std::与VS2013相比,GCC 4.7.2中的MAP实现效率非常低
- 标准::矢量的概念和GCC实现
- 如何为在 .props 文件中声明的非本机 VC 编译器 (GCC) 实现 MSBUILD 文件跟踪功能 (跟踪器.ex
- 重新解释转换行为的GCC实现
- 帮助GCC实现自动矢量化