gpt4 book ai didi

c++ - 这是 Mac OS X 10.6 C++ 标准 API 中的错误吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:44 26 4
gpt4 key购买 nike

以下代码无法在 Mac OS X 10.6 上编译;它在 STL_algobase.h 中给出一个错误,遵循“实例化自 [...]”消息列表。

#include <vector>

int main( void )
{
std::vector<int*> *v = new std::vector<int*>( 1, NULL );

return 0;
}

为了使其编译,我必须在 NULL 周围进行显式转换,即将其替换为 (int*)(NULL)
不过,这看起来有点尴尬,我怀疑是否真的有必要;它还使我的源代码看起来很奇怪,因为结构和更长的类型名称嵌套在命名空间等中。

编辑(错误信息):

/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_algobase.h: In static member function 'static _OutputIterator std::__fill_n<true>::fill_n(_OutputIterator, _Size, const _Tp&) [with _OutputIterator = int**, _Size = int, _Tp = int]':
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_algobase.h:665: instantiated from '_OutputIterator std::fill_n(_OutputIterator, _Size, const _Tp&) [with _OutputIterator = int**, _Size = int, _Tp = int]'
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_uninitialized.h:184: instantiated from 'void std::__uninitialized_fill_n_aux(_ForwardIterator, _Size, const _Tp&, std::__true_type) [with _ForwardIterator = int**, _Size = int, _Tp = int]'
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_uninitialized.h:219: instantiated from 'void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = int**, _Size = int, _Tp = int]'
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_uninitialized.h:306: instantiated from 'void std::__uninitialized_fill_n_a(_ForwardIterator, _Size, const _Tp&, std::allocator<_Tp2>) [with _ForwardIterator = int**, _Size = int, _Tp = int, _Tp2 = int*]'
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_vector.h:790: instantiated from 'void std::vector<_Tp, _Alloc>::_M_initialize_dispatch(_Integer, _Integer, std::__true_type) [with _Integer = int, _Tp = int*, _Alloc = std::allocator<int*>]'
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_vector.h:261: instantiated from 'std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const _Alloc&) [with _InputIterator = int, _Tp = int*, _Alloc = std::allocator<int*>]'
/Users/JayZ/projects/C++/test/main.cpp:6: instantiated from here
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_algobase.h:641: error: invalid conversion from 'const int' to 'int*'

如果这可以帮助...

最佳答案

发生的事情是编译器必须在允许多个参数的 vector 构造函数重载之一之间进行选择:

explicit vector(size_type n, const T& value = T(),
const Allocator& = Allocator());

template <class InputIterator>
vector(InputIterator first, InputIterator last,
const Allocator& = Allocator());

第一个重载(您要匹配的重载)要求转换参数。第二个不需要转换,因为 2 个参数是同一类型。这就是编译器选择的重载。不幸的是,int 类型没有第二个构造函数用于这些参数的所有操作。

通过将 NULL 转换为 int* 或通过将第一个参数设置为无符号 (1U) 来强制参数为不同类型作为其他答案正确建议将通过强制编译器选择第一个构造函数选项来避免该问题。

更新:

当我用 MinGW 4.5.2 编译它时,我得到了编译错误(不同的错误,但出于同样的原因,我相信)。但是,当我使用 MSVC(2008 或 2010)构建时,我没有收到任何错误。当我查看 MSVC 生成的代码时,它实际上匹配第二个重载(带有 2 个迭代器)而不是“大小和默认值”重载。

“啊哈”,我想,“这会在运行时某处崩溃,因为具有值 10 的迭代器没有任何意义”。

但是,当该构造函数的“迭代器”类型恰好是 int 时,MSVC 实现会执行 vector 的“计数/初始值”构造。

该标准规定了当构造函数的 InputIterator 参数满足 InputIterator 的要求时构造函数必须执行的操作。由于 int 不满足 InputIterator 的要求,因此该实现有一些自由支配权来做其他事情。该标准说“一个实现可以在一个类中声明额外的非虚拟成员函数签名”(17.4.4.4),我相信这将涵盖 MSVC 的行为。您在 GCC 4.5.2 中看到的和我在 GCC 4.5.2 中看到的产生错误诊断的行为也是标准允许的。

我确信 MSVC 的行为是大多数用户的意图和想要的(直到他们可能将代码转移到其他编译器)。这当然很聪明。

关于c++ - 这是 Mac OS X 10.6 C++ 标准 API 中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5606091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com