std :: pair<>的模板成员必须有const复制构造函数。如何实现该约束

时间:2016-02-22 12:33:44

标签: c++ templates c++11 std-pair

C ++ 11标准要求std::pair<>的模板成员必须具有 const 复制构造函数。否则,它将无法编译。(来自书籍 C ++标准库,Nicolai M. Josuttis。)。因此,如果符合c ++ 11标准,下面的代码将无法编译:

class A{
    int i;
public:
    A(){}
    A(A&){} 
};

int main(){
    pair<int, A> p;
}

使用-std=c++11,G ++编译器将报告错误:

  
    

constexpr std :: pair&lt; _T1,_T2&gt; :: pair(const std :: pair&lt; _T1,_T2&gt;&amp;)[with _T1 = int; _T2 = A]'声明采用const引用,但隐式声明将采用非const:

            constexpr pair(const pair&) = default
  

这是因为我们将A的复制构造函数声明为非const。如果我们将A(A&){}更改为A(const A&){},或者我们删除了-std=c++11标记,那么一切都会好的。

我的问题是,这个constaint是如何实现的?我看不到语言本身的支持,它们为我们提供了模板参数T的内部视图。我的意思是,宣布这样的事情:

template<typename T1, typename T2>
class pair{
    ...
    //how do you know whether the constructor of T1 and T2 are const ?
    ...
};

如何知道T1和T2的构造函数是const还是

1 个答案:

答案 0 :(得分:3)

  

//你怎么知道T1和T2的构造函数是否为const?

您使用std::is_copy_constructible