【问题标题】:C++11 vector push_back ambiguousC++11 向量 push_back 不明确
【发布时间】:2011-05-17 00:19:07
【问题描述】:

考虑以下代码:

#include <vector>

struct S { int a; double b; };

int main()
{
    std::vector<S> v;
    v.push_back({3, 4.5});
}

g++ 4.4 抱怨对 push_back() 的调用不明确:

error: call of overloaded ‘push_back(<brace-enclosed initializer list>)’ is ambiguous
note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = S, _Alloc = std::allocator<S>]
note:                 void std::vector<_Tp, _Alloc>::push_back(_Tp&&) [with _Tp = S, _Alloc = std::allocator<S>]

根据标准,这应该是模棱两可的,还是这只是 g++ 的问题?

我知道可以通过显式写入 S 的类型来解决:

v.push_back(S{3, 4.5});

但是 S 的类型名称可能很长,所以我宁愿不这样做......

【问题讨论】:

  • 我猜你的编译器没有完成所有新的右值引用(移动或 &&)实现以及一个规则集,该规则集更喜欢用于该临时的表单(应该采用可移动的因为你的对象是临时的)

标签: c++ vector c++11


【解决方案1】:

S 必须是 POD 吗?如果没有,请定义一个构造函数,它应该可以工作。

struct S
{
    int a;
    double b;

public:

    S(int a, double b) : a(a), b(b) {}
};

另外,v.push_back({3, 4.5}) 的效率可能低于v.emplace_back(3, 4.5)


更新:闻起来像编译器错误。它与 g++ 4.6.0 20101025(实验性)完美配合。

【讨论】:

  • 虽然有用,但不是 OP 真正要求的?我也很好奇那里发生了什么 - 为什么一个变体对于作为左值/右值是模棱两可的,而另一个不是,而它们都是临时的。
  • @Kos:临时工有不同的类型。 {3, 4.5}std::initializer_list&lt;double&gt;,而 S{3, 4.5}S。也许这与aint 而不是double 的事实有关?老实说,我不知道。
  • 有趣,我不知道 emplace_back。但是,它似乎也需要 S 的构造函数。
  • @FredOverflow:我不认为 {3, 4.5} 的类型是 std::initializer_list - 这意味着 {} 中每个对象的类型都被强制为同样的事情,这是不可能的,因为 {} 语法适用于具有广泛不同成员类型的结构。
  • HighCommander4 是对的,我认为——根据我从 C++0x wiki 的理解,一个类需要有一个像 Class(std::initializer_list&lt;sometype&gt; list) 这样的构造函数才能真正使用初始化列表。这个问题是关于 “统一初始化”,这是一个不同的概念,我想似乎与 std::initializer_list 无关 - 除了大括号 {} 符号。
【解决方案2】:

对于最新的草稿 (n3225),您的代码实际上是模棱两可的。向量中的候选人将是

void push_back(const S& x);
void push_back(S&& x);

问题是:与S&amp;&amp; 的列表初始化相比,const S&amp;列表初始化是一个更好/更差的转换序列?重载解决方案将使这两种转换用户定义的转换序列。这意味着它们具有可比性,因为没有规则可以做到这一点。

这由core issue #1079 处理。如果该问题被接受,则意图是您的代码调用第二个候选人。顺便说一句,Jason Merril 是一名 GCC 开发人员 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2014-09-13
    • 2013-03-28
    • 1970-01-01
    • 2013-03-01
    • 2023-04-06
    相关资源
    最近更新 更多