统一初始化和初始化列表之间的 C++11 歧义

时间:2020-12-22 10:52:28

标签: c++ c++11 g++ initializer-list

我发现以不同方式解释 {}-list 的情况可能会导致细微的错误。例如在这个程序 (g++ 10.2.1) 中:

#include <vector>
#include <iostream>

struct A {
        int n1;
        int n2;
        //A(int _n1 = 0, int _n2 = 0): n1(_n1), n2(_n2) {}
};

int main() {
        std::vector<A> v;
        v.push_back({1,2});
        std::cout << v.size() << std::endl;
        v.insert(v.end(), {3,4});
        std::cout << v.size() << std::endl;
}

A 中没有构造函数时,insert 添加了一个元素。定义构造函数,insert 添加两个元素,为每个数字构建一个 A 对象。这是因为 insert(与 push_back 不同)对单个对象或初始值设定项列表具有不同的重载。当然,如果您明确写出 A{3,4},则情况并非如此。

我的问题:

  • 是否有一个连贯的推理路线来了解此类情况?
  • 您还知道其他类似的案例吗?
  • 编辑为什么一个重载优先于另一个重载,编译器不会给出可能匹配更多重载的错误?

0 个答案:

没有答案
相关问题