【发布时间】: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 的类型名称可能很长,所以我宁愿不这样做......
【问题讨论】:
-
我猜你的编译器没有完成所有新的右值引用(移动或 &&)实现以及一个规则集,该规则集更喜欢用于该临时的表单(应该采用可移动的因为你的对象是临时的)