当前位置: 首页 > 知识库问答 >
问题:

确认MSVC 2015 RC中与分配器相关的标准库Bug

涂泰平
2023-03-14

下面是一个SSCCE:

#include <memory>
#include <vector>

template <class T> struct my_allocator : std::allocator<T> {
    //This overriding struct causes the error
    template <class U> struct rebind {
        typedef my_allocator<T> other;
    };

    //Ignore all this.
    typedef std::allocator<T> base;
    typename base::pointer allocate(typename base::size_type n, std::allocator<void>::const_pointer /*hint*/=nullptr) { return (T*)malloc(sizeof(T)*n); }
    void deallocate(typename base::pointer p, typename base::size_type /*n*/) { free(p); }
};

int main(int /*argc*/, char* /*argv*/[]) {
    std::vector<int,my_allocator<int>> vec;
    return 0;
}

GCC喜欢它。
ICC喜欢它。
Clang喜欢它。
甚至MSVC2013也喜欢它。
但是MSVC2015 RC吐槽:

1>------ Build started: Project: Test Alloc, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector(579): error C2664: 'void std::_Wrap_alloc<my_allocator<int>>::deallocate(int *,unsigned int)': cannot convert argument 1 from 'std::_Container_proxy *' to 'int *'
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector(579): note: Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector(574): note: while compiling class template member function 'void std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>::_Free_proxy(void)'
1>          with
1>          [
1>              _Ty=int,
1>              _Alloc=my_allocator<int>
1>          ]
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector(541): note: see reference to function template instantiation 'void std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>::_Free_proxy(void)' being compiled
1>          with
1>          [
1>              _Ty=int,
1>              _Alloc=my_allocator<int>
1>          ]
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector(668): note: see reference to class template instantiation 'std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>' being compiled
1>          with
1>          [
1>              _Ty=int,
1>              _Alloc=my_allocator<int>
1>          ]
1>  c:\users\ian mallett\desktop\test-alloc\main.cpp(18): note: see reference to class template instantiation 'std::vector<int,my_allocator<int>>' being compiled

相关程序给出了类似的可疑的听起来错误。下面有两个:
错误C2664:“void std::_wrap_alloc>::deallocate(int*,unsigned int)':无法将参数1从”std::_container_proxy*“转换为”int*“
无法将参数1从”std::_wrap_alloc>“转换为”const aligned_allocator&“

[编辑:正如注释中所指出的,这只在调试模式下发生。在发布模式下,它编译和执行都很好。][编辑:简单得多的示例]

共有1个答案

单于浩邈
2023-03-14

布尔问题:这是一个bug吗?

false

虽然这里MSVC给出的模板错误非常无益,但这里的错误是我的(因为这个版本的标准库今天已经发布了,所以让人放心)。

 类似资料:
  • 本页列出了所有Apache遵守的相关标准,并伴有简要描述。 除了下面列出的参考信息,下列资源也值得看看: http://purl.org/NET/http-errata - HTTP/1.1 勘误表 http://www.rfc-editor.org/errata"http://ftp.ics.uci.edu/pub/ietf/http/"> http://ftp.ics.uci.edu/pub/

  • 除了这里提到内容外,每个独立的工程都期望能建立附加标准。下面是每个工程程序管理组需要考虑的问题中的一部分: 哪些额外的命名约定需要遵守?尤其是,那些用于全局数据的功能归类以及结构体或联合体成员名字的系统化的前缀约定非常有用。 什么样的头文件组织适合于工程特定的数据体系结构? 应该建立什么样的规程来审核lint警告?需要确立一个与lint选项一致的宽容度,保证lint不会针对一些不重要的问题给出警告

  • 如果我们以任务分配给员工为例,根据员工的可用性和执行单个任务所需的技能(硬约束),我们将任务列表分配给员工列表。 现在,如果有一项任务,而没有任何员工具备完成该任务的技能,Optaplanner仍会将该任务分配给员工,并打破一个硬约束。这个结果告诉我,有一个硬约束被打破了,但任务仍然被分配,这影响了员工应该做的任务链,即不是分配一个不相关的(没有技能的)任务,系统(Optaplanner)不应该提

  • 标准正态分布的概率密度函数定义为e < sup >-x < sup > 2 /2 /√(2π)。这可以用简单的方式转换成C代码。单精度实现的示例可能是: 虽然此代码没有过早的下限溢位,但存在精度问题,因为计算2/2时产生的误差会被后续的幂运算放大。人们可以通过针对更高精度引用的测试轻松证明这一点。确切的误差将根据所使用的或实现的准确性而有所不同;对于忠实四舍五入的幂函数,人们通常会观察到IEEE-

  • 问题内容: 如何在用户离开Gmail之前向用户要求确认? 我在各个地方搜索了这个问题,但他们提到的只是使用javascript window.unload 和 window.onbeforeunload 。而且,由于它被阻塞,大多数情况下在chrome中都不起作用。 问题答案: 尝试这个:

  • 我试图寻找这个问题的答案,但始终没有找到答案。 当我定义最大堆大小时,为Java GC空间分配大小的标准比率是多少? 也就是说:如果我用4Gb的堆启动JVM,那么分配给Eden的是多少?给幸存者多少钱?终身监禁要多少钱? 此外,对于不同的VM供应商,该比率是否会发生变化? 提前谢谢