考虑以下代码:
#include <vector>
struct A
{
explicit A(int i_) : i(i_) {}
int i;
};
int main()
{
std::vector<int> ints;
std::vector<A> As(ints.begin(), ints.end());
}
以上代码是否能够编译?我的感觉是不行的,因为构造函数被标记为
explicit
。
Microsoft Visual C++ 给出了明确的错误信息:cannot convert from 'int' to 'const A'; Constructor for struct 'A' is declared 'explicit'
然而,在使用Comeau在线编译器时,代码成功编译。
哪个是正确的呢?
编辑:
有趣的是,将vector
更改为set
(在 A 中添加operator <
后),两个编译器都会报错。
但是,将vector<int>
更改为map<int, int>
,并将vector<A>
更改为map<A, A>
,这两个编译器都接受该代码!
std::vector<int>::iterator
不是整数类型,而且 fill-constructor 没有被调用。所以我删除了它。我认为我能说的就是,在任何容器构造函数中,标准都不会禁止显式转换。 - Potatoswatter