考虑一下:
std::vector<int*> v(1, 0);
Run Code Online (Sandbox Code Playgroud)
这与VC++ 10编译良好(即使在最大警告级别也没有警告).但是,它不能在linux上使用llvm或在linux上使用gcc进行编译,从而产生类似"从不兼容的类型const int分配给int*"的错误.我不是在寻找解决方案 - 我知道第二个参数是不必要的,或者static_cast修复了错误.
我认为零可以隐式转换为任何指针类型.是什么赋予了?我可以做以下事情:
int* i = 0;
int* const& ii = 0;
const int t = 0;
i = t;
Run Code Online (Sandbox Code Playgroud)
我理解向量构造函数签名const T&在扩展时vector<int*>会变为int* const&正确吗?有人可以解释这里发生了什么,以及VC++或非VC++编译器是否正确?
看起来 g++ 这里实际上是错误的。请参阅 C++98 23.1.1/9:
\n\n\n\n\n对于本节和第 21 节中定义的每个序列:
\n\n\xe2\x80\x94 构造函数模板 X(InputIterator f,\n InputIterator l, const Allocator& a = Allocator())
\n\n应具有与以下内容相同的效果:
\nX(static_cast<typename X::size_type>(f),\n static_cast<typename X::value_type>(l), a)如果 InputIterator 是整型。
请注意,这InputIterator是构造函数的模板参数,在本例中将用于int您的示例,因此是整数类型。g++ 库实际上有特定的代码来处理所有存储在 中的类型也是vector整数的情况,并且这些都将正常工作。在这种情况下,只有因为你使用了标准所规定的0内容才真正合法。static_cast我尝试编译标准所说应该等效的代码,它使用 g++ 4.5 进行编译。