在C ++ 11中使用std :: vector <bool> :: emplace

时间:2017-07-07 12:56:55

标签: c++11

根据cppreference.com

  

备注

     

专精std::vector<bool>没有emplace()成员   直到C ++ 14。

这是什么意思?模板专业化可以省略成员吗?是否意味着成员函数根本不存在?或者它只是不专业?

以下代码似乎适用于gcc 7.1.0:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    std::vector<bool> v;
    v.emplace_back(true);
    v.emplace_back(false);
    for (const auto &b : v) {
        std::cout << b << std::endl;
    }
}

http://coliru.stacked-crooked.com/a/07c8c0fc6050968f

1 个答案:

答案 0 :(得分:3)

模板专业化可以与通用模板完全不同。所以从理论上讲,你无法知道类A<int>A<bool>是否有任何共同的成员:

template <typename T>
class A
{
public:
    void foo()
    {}
};


template <>
class A<bool>
{
public:
    void bar()
    {}
};


int main()
{
    A<int> a;
    a.foo();

    A<bool> b;
    b.bar();

    b.foo();  // error: 'class A<bool>' has no member named 'foo'
}

班级std::vector<bool>是一个专门的模板。您对标准的引用表明,在C ++ 14之前,该专业化中缺少emplace()方法。

实际上,即使在C ++ 14之前,具体的标准库(如libstdc ++)也可能为emplace()提供了std::vector<bool>方法,但标准中并不要求它。