9

考虑一下:

std::vector<int*> v(1, 0);

这与 VC++10 编译得很好(即使在最大警告级别也没有警告)。但是,它不能在 mac 上使用 llvm 或在 linux 上使用 gcc 进行编译,从而出现类似“assigning to int* from in compatible type const int”之类的错误。我不是在寻找解决方案——我知道第二个参数是不必要的,或者 static_cast 修复了错误。

我认为零可以隐式转换为任何指针类型。是什么赋予了?我可以执行以下操作:

int* i = 0;
int* const& ii = 0;
const int t = 0;
i = t;

我知道向量构造函数签名const T&在扩展为正确vector<int*>时采用哪个?int* const&有人可以解释这里发生了什么,以及 VC++ 或非 VC++ 编译器是否正确?

4

2 回答 2

2

std::vector有一个带有这个签名的讨厌的构造函数

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

如果编译器从您的参数中减去InputIterator( int!)01, 将是一个很好的选择,但不会做我们想要的。

我相信 C++11 要求编译器更加努力地确定参数是否实际上是迭代器。在 C++03 中,它们可能会以size_type(1)and结尾int(0),从而导致您的问题。

整数文字 0 可转换为空指针,但int值为 0 的则不能!

于 2012-04-04T19:14:08.850 回答
2

看起来 g++ 在这里实际上是错误的。参见 C++98 23.1.1/9:

对于本节和第 21 节中定义的每个序列:

— 构造函数模板 X(InputIterator f, InputIterator l, const Allocator& a = Allocator())

应具有相同的效果:X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a)如果 InputIterator 是整数类型。

请注意,这InputIterator是构造函数的模板参数,在这种情况下,它将是int您的示例,因此是整数类型。g++ 库实际上具有特定的代码来处理存储在其中的类型vector也是整体的所有情况,并且这些情况都将正常工作。在这种情况下,仅因为您使用了标准0static_cast规定的内容,它实际上是合法的。我尝试编译标准所说的代码应该是等效的,并且它使用 g++ 4.5 编译。

于 2012-04-04T20:12:35.393 回答