通过decltype声明一个向量

时间:2016-10-25 15:57:52

标签: c++ c++11 c++14 type-inference decltype

#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." 

1 个答案:

答案 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也适用于这种特殊情况。

这里是working example on wandbox.