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
还是