首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++11向量push_back不明确

C++11向量push_back不明确
EN

Stack Overflow用户
提问于 2010-11-29 06:15:44
回答 1查看 3.8K关注 0票数 17

考虑以下代码:

代码语言:javascript
复制
#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()的调用不明确:

代码语言:javascript
复制
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类型中显式写入来解决:

代码语言:javascript
复制
v.push_back(S{3, 4.5});

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-12 09:20:19

使用最新的草案(n3225),您的代码实际上是模棱两可的。向量中的候选者将是

代码语言:javascript
复制
void push_back(const S& x);
void push_back(S&& x);

问题是:与S&&的列表初始化相比,const S&的列表初始化是更好/更差的转换序列吗?重载解析将使两个转换都成为用户定义的转换序列。这意味着它们不具有可比性,因为没有规则可以这样做。

这是由core issue #1079处理的。如果这个问题被接受,那么你的代码就会调用第二个候选者。顺便说一句,Jason Merril是一名GCC开发人员:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4299439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档