#include "stdafx.h"
#include <iostream>
#include <vector>
#include <map>
template <typename T>
auto Copy(T c)
{
std::vector<decltype(c.begin()->first)> lc;
//Copying
return lc;
}
int main()
{
std::map<int, int> map;
Copy(map);
return 0;
}
在上面的代码中,我尝试从vector
的键的数据类型声明map
,但我收到以下错误 -
"The C++ Standard forbids containers of const elements allocator<const T> is ill-formed."
答案 0 :(得分:5)
问题是decltype(c.begin()->first)
会返回const int
(使用 libstdc ++ 时 - 您的示例使用 libc ++ 进行编译)
正如你的错误告诉你的那样......
C ++标准禁止使用const元素的容器,因为allocator&lt; const T>是不正确的。
可能的解决方案是使用std::decay_t
:
std::vector<std::decay_t<decltype(c.begin()->first)>> lc;
这将保证您的示例适用于 libstdc ++ 和 libc ++ 。或者,std::remove_const_t
也适用于这种特殊情况。