Failure while trying to construct a std::list with an allocator
我发现了一个奇怪的行为,当试图将一些代码与采用自定义分配器的普通std::list进行比较时。考虑以下代码:
1 2 | std::list<int, std::allocator<int>> theList; theList.push_back(1); |
它是一个普通的列表变量,添加了一些数据。现在,如果我切换到:
1 2 | std::list<int, std::allocator<int>> theList(std::allocator<int>()); theList.push_back(1); |
Visual Studio 2012未能编译它,并显示"错误C2228:左侧为".push"back"必须具有类/结构/联合"。当然,std::list有一个构造函数,它将常量引用给一个分配器。但如果我把它改成:
1 2 | std::list<int, std::allocator<int>> theList = std::list<int, std::allocator<int>>(std::allocator<int>()); theList.push_back(1); |
一切都很好。为什么第二部分失败了?当试图按价值返回列表时,为了增加情况的奇怪性:
1 2 3 4 5 6 7 | typedef std::list<int, std::allocator<int>> TempType; TempType func() { TempType theList(std::allocator<int>()); return theList; } |
我得到"error c2664:'std::list
你遇到了最麻烦的分析。编译器正在将EDOCX1的定义解析为函数声明。这样可以解决您的问题:
1 2 | std::allocator<int> alloc; std::list<int, std::allocator> > theList(alloc); |
这被称为最令人烦恼的分析。
您意外地声明了一个函数。添加一组额外的括号将使其明确。
1 2 | std::list<int, std::allocator<int>> theList((std::allocator<int>())); // ^ ^ |