C++显式构造函数和迭代器

use*_*783 7 c++ constructor iterator explicit

请考虑以下代码:

#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());
}
Run Code Online (Sandbox Code Playgroud)

上面应该编译吗?由于构造函数被标记,我的感觉是它不应该explicit.

Microsoft Visual C++同意,给出一个明确的错误消息: cannot convert from 'int' to 'const A'; Constructor for struct 'A' is declared 'explicit'

但是,使用Comeau的在线编译器,代码编译成功.

哪个是对的?

编辑:

有趣的是,更改vectorset(在添加operator <到A之后)会导致两个编译器都出错.

然而,改变vector<int>map<int, int>vector<A>map<A, A>原因两种编译器接受代码!

Pot*_*ter 4

我查看了 GCC 的 STL 实现,它应该有类似的行为。这就是原因。

\n\n
    \n
  • a 的元素vector由通用函数模板初始化,该模板接受任意两种类型XV调用new( p ) X( v )where vis a V(我解释了一下)。这允许显式转换。
  • \n
  • seta或的元素map由一个私有成员函数初始化,该成员函数_tree<T,\xe2\x80\xa6>明确要求T const &传入 a。此成员函数不是模板(超出了模板的成员范围),因此如果初始值不能隐式转换为T,调用失败。(我再次简化代码。)
  • \n
\n\n

该标准不要求在使用范围初始化容器时进行显式转换或隐式转换不起作用。它只是说范围被复制到容器中。对于您的目的来说绝对不明确。

\n\n

令人惊讶的是,考虑到像我几周前遇到的问题,他们已经完善了标准,所以存在这种模糊性。

\n