为什么 `vector v{{5,6}};` 有效?我以为只允许使用一对 {}?

2024-01-03

给定一个类A有两个构造函数,取initializer_list<int> and initializer_list<initializer_list<int>>分别,那么

A v{5,6};

称前者为

A v{{5,6}};

正如预期的那样,调用后者。 (clang3.3,显然 gcc 的行为不同,请参阅答案。标准要求什么?)

但是如果我删除第二个构造函数,那么A v{{5,6}};仍然编译并使用第一个构造函数。我没想到这一点。 我以为A v{5,6}将是only访问方式initializer_list<int>构造函数。

(我在玩的时候发现了这一点std::vector and 我在 Reddit 上问的这个问题 http://www.reddit.com/r/cpp/comments/1td0dt/why_vectorint_v5_isnt_the_same_as_vectorint_v5/,但我创建了自己的类 A 以确保它不仅仅是接口的一个怪癖std::vector.)


我认为这答案可能相关 https://stackoverflow.com/a/9723448/1508519.

是的,根据 §13.3.1.7 初始化,此行为是有意的 通过列表初始化

当非聚合类类型 T 的对象被列表初始化时 (8.5.4),重载决策分两个阶段选择构造函数:

— 最初,候选函数是类 T 的初始化列表构造函数(8.5.4),参数列表包括 初始化列表作为单个参数。

— 如果没有找到可行的初始化列表构造函数,则再次执行重载决策,其中候选函数全部为 类 T 的构造函数和参数列表由以下组成 初始化列表的元素。

In gcc我试过你的例子。我收到此错误:

error: call of overloaded 'A(<brace-enclosed initializer list>)' is ambiguous

gcc如果我使用三套支架,就不再抱怨了。 IE。:

#include <iostream>
#include <vector>
#include <initializer_list>

struct A {
    A (std::initializer_list<int> il) { 
        std::cout << "First." << std::endl;
    }
    A (std::initializer_list<std::initializer_list<int>> il) { 
        std::cout << "Second." << std::endl;
    }
};

int main()
{
    A a{0}; // first
    A a{{0}}; // compile error
    A a2{{{0}}}; // second
    A a3{{{{0}}}}; // second
}

为了镜像向量的构造函数,以下是我的结果:

#include <iostream>
#include <vector>
#include <initializer_list>

struct A {
    A (std::initializer_list<int> il) { 
        std::cout << "First." << std::endl;
    }
    explicit A (std::size_t n) {
        std::cout << "Second." << std::endl;
    }
    A (std::size_t n, const int& val) {
        std::cout << "Third." << std::endl;
    }
    A (const A& x) {
        std::cout << "Fourth." << std::endl;
    }
};

int main()
{
    A a{0};
    A a2{{0}};
    A a3{1,2,3,4};
    A a4{{1,2,3,4}};
    A a5({1,2,3,4});
    A a6(0);
    A a7(0, 1);
    A a8{0, 1};
}

main.cpp:23:10: warning: braces around scalar initializer

    A a2{{0}};

         ^~~

1 warning generated.

First.
First.
First.
First.
First.
Second.
Third.
First.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 `vector v{{5,6}};` 有效?我以为只允许使用一对 {}? 的相关文章

随机推荐

  • IE7 与 Firefox/Opera/Chrome 之间的间距差异

    我对 IE7 与 Firefox Chrome Opera 中无序列表的垂直空间量一直存在问题 而且我似乎找不到解决方案 在IE7中 空间变小了 这也是我希望看到的 在 Firefox Chrome 和 Opera 中 之间的间距大约是原来
  • java.lang.RuntimeException:在android中createWindowSurface失败EGL_BAD_ALLOC

    我为我的应用程序创建了 1080x1920 的自定义 Galaxy S4 AVD 我可以在该 AVD 中运行我的应用程序 几秒钟后它会闪烁并抛出一些像这样的错误 02 05 12 06 39 809 E EGL emulation 829
  • 将泛型参数转换为整数或从整数转换

    我想编写通用类 旨在与内置类型一起使用 例如byte and ushort 在内部计算中 我需要将泛型类型转换为整数 然后再转换回泛型类型 我找到了编译此类代码的方法 例如 class Test
  • 使用arm-linux-androideabi-4.4.3编译ICU

    我想使用 Cygwin 交叉编译 Android 的 ICU 静态库 到目前为止 我已经能够配置和制作 Cygwin MSVC 和 Cygwin 版本 我已经安装了android ndk r7 并且可以在toolchains目录中看到gcc
  • 为什么应该使用条件样式表?

    这个问题涵盖了大部分内容 但我试图向想要完全放弃条件样式表 IE6 移动设备等 的高级开发人员提出一个清晰的论点 请记住 我们实际上并没有消除 IE6 只是消除了样式表 还是我疯了 应该接受这个 还有什么选择呢 CSS 黑客 我有 IE7
  • 当用户点击下拉列表 HTML 选择标签时,ios8 iPad uiwebview 在显示弹出窗口时崩溃

    在 ios8 和 iPad 上 如果uiwebview正在显示一个包含下拉列表的 HTML 页面 例如这个页面http www w3schools com tags tryit asp filename tryhtml select htt
  • Maven War 插件中的过滤

    我不明白 Maven War 插件的以下过滤器配置 有人可以向我解释一下他们在做什么吗 我已经用第一个示例和第二个示例标记了代码
  • 如何对 ExecutorService 为任务生成新线程进行单元测试?

    使用 ExecutorService 时 一个单元如何测试是否为可运行任务生成了新线程 基本上 我的应用程序有一个静态线程池 public static final ExecutorService executorService Execu
  • 如何通过管道传输或重定向curl -v 的输出?

    由于某种原因 输出总是被打印到终端 无论我是否通过 2 gt 或 gt 或 重定向它 有办法解决这个问题吗 为什么会发生这种情况 add the s 静默 选项删除进度表 然后将 stderr 重定向到 stdout 以在与响应正文相同的
  • 始终并行运行恒定数量的子进程

    我想使用子进程让编写的脚本的 20 个实例并行运行 假设我有一个包含大约 100 000 个条目的大 URL 列表 并且我的程序应该控制我的脚本的 20 个实例始终在该列表上工作 我想将其编码如下 urllist url1 url2 url
  • C++11 中的 C 风格回调

    在 C 11 项目中 我使用需要 C 风格回调的 C 风格第三方库 在我的例子中为curl 为了实现这一点 我使用了 指向成员的指针 运算符 size t c callback wrapper char ptr size t size si
  • onClick 不起作用

    我想使用 JS 将表格行转换为链接 我的它看起来像这样 tr 但是 当我尝试单击时 它并没有按照我想要的方式进入页面 事实上 点击似乎没有任何动作 有什么帮助吗 Edit 至于引用 我忘了提及我是用 PHP 来回应这一点的 这是我更新的代码
  • 外键引用同一个表

    有一次面试测试 下面是表格和结构 Table Person id name dob dod mother id father id Primary Key id Foreign Key mother id references Person
  • 在 Electron 应用程序中导航 Angular 路线时出现空白屏幕

    我目前正在使用 Electron 编写一个桌面混合应用程序 并与 AngularJS 集成进行路由等 请参阅以下角度配置 app config function routeProvider locationProvider routePro
  • 在 C# 中解析 SQL 字符串

    我需要解析一个Command CommandText 我不想运行查询 我只想看看如果执行命令 查询是否会成功 说我有 SELECT FROM SomeTable WHERE 1 1 该字符串将会成功 but SELECT FROM Some
  • 如何知道用户何时离开页面并刷新页面

    我想在用户离开页面之前进行 AJAX 调用 基本上是在离开页面之前和刷新页面之前 如何才能做到这一点 我试图用 jQuery 搜索一些东西 但没有得到任何结果 我尝试使用以下代码 window onbeforeunload function
  • mysql 查询是否可以返回 true/false 而不是值?

    我有一张桌子 custID orderID orderComponent 1 123 pizza 1 123 wings 1 234 breadsticks 1 239 salad 2 456 pizza 2 890 salad 我有一个值
  • 在构建情况下验证所属关联

    我有一个任务模型 它有很多任务 并且任务属于任务 为了安全起见 我对任务模型进行了验证 validates presence of mission id validates numericality of mission id 但问题是 当
  • IPFS:如何将文件添加到现有文件夹?

    给定一个相当大的文件夹 它已经被推送到网络 并在本地删除 如何将文件添加到该文件夹 而不重新下载整个文件夹 你只能通过使用来做到这一点ipns再次下载后ipfs get 如果它仍然固定到本地存储 那么应该会很快 1 首先将您的文件夹递归添加
  • 为什么 `vector v{{5,6}};` 有效?我以为只允许使用一对 {}?

    给定一个类A有两个构造函数 取initializer list