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

标签 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());
}

上面的代码应该编译吗?我的感觉是不应该,因为构造函数被标记为 explicit .

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

但是,使用 Comeau's online compiler , 代码编译成功。

哪个是正确的?

编辑:

有趣的是,改变vectorset (在向 A 添加 operator < 之后)导致两个编译器都给出错误。

但是,改变 vector<int>map<int, int>vector<A>map<A, A>导致两个编译器都接受代码!

最佳答案

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

  • 元素vector由接受任何两种类型的通用函数模板初始化 XV并调用 new( p ) X( v )其中 vV (我在解释一下)。这允许显式转换。
  • 元素setmap_tree<T,…> 的私有(private)成员函数初始化特别期待 T const &要传入。此成员函数不是模板(除了是模板的成员之外),因此如果初始值不能隐式转换为 T ,调用失败。 (我再次简化了代码。)

该标准不要求在使用范围初始化容器时显式转换有效或隐式转换无效。它只是说范围被复制到容器中。对于您的目的来说绝对是模棱两可的。

令人惊讶的是,存在这样的歧义,考虑到他们已经在考虑 the one I had 等问题的情况下改进了标准。几周前。

关于C++ 显式构造函数和迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2003266/

相关文章:

c++ - 构造函数初始化列表中的ADL

c++ - boost vs POCO 关于学习曲线和初学者的适用性(HTTP 客户端)

c++ - 带有 GNU/Linux 代码生成工具的 UML

c++ - 从只能访问迭代器的 std::list 中删除项目

c++ - 清除已经为空的 vector 会导致未定义的行为吗?

c++ - 试图理解为什么 multimap 会像现在这样构造/分解结构

java - 变量多态性的初始化

c++ - 没有默认构造函数的类

java - 通过二维数组重新开始迭代

C++ 14制作自定义迭代器,它将经过2并返回修改后的数据