代码之家  ›  专栏  ›  技术社区  ›  HighCommander4

C++ 11矢量推回模糊

  •  17
  • HighCommander4  · 技术社区  · 14 年前

    请考虑以下代码:

    #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的类型名可能很长,所以我不想这样做。。。

    2 回复  |  直到 13 年前
        1
  •  4
  •   Johannes Schaub - litb    14 年前

    对于最新的草稿(n3225),您的代码实际上是不明确的。向量中的候选项将是

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

    问题是:是 列表初始化 一个 const S& 较好/较差转换序列 而不是 S&& ? 重载解析将使两个转换 用户定义的转换序列 . 这意味着他们是 可比性,因为没有规则可以这么做。

    这是由 core issue #1079 . 如果这个问题被接受,目的是您的代码调用第二个候选者。顺便说一下,Jason Merril是GCC开发人员:)

        2
  •  6
  •   fredoverflow    14 年前

    S 一定是豆荚?如果不是,定义一个构造函数,它应该可以工作。

    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(实验)配合得非常好。