在尝试使用带有自定义分配器的普通 std::list 编译一些代码时,我发现了一个奇怪的行为。考虑以下代码:
std::list<int, std::allocator<int>> theList;
theList.push_back(1);
这是一个添加了一些数据的普通列表变量。现在,如果我将其切换为:
std::list<int, std::allocator<int>> theList(std::allocator<int>());
theList.push_back(1);
Visual Studio 2012 无法编译它并出现“错误 C2228:'.push_back' 左侧必须有类/结构/联合”。当然 std::list 有一个构造函数,它接受对分配器的 const 引用。但是,如果我将其更改为:
std::list<int, std::allocator<int>> theList = std::list<int, std::allocator<int>>(std::allocator<int>());
theList.push_back(1);
一切皆好。为什么第二部分失败了?为了增加情况的奇怪之处,当尝试按值返回列表时:
typedef std::list<int, std::allocator<int>> TempType;
TempType func()
{
TempType theList(std::allocator<int>());
return theList;
}
我得到“错误 C2664: 'std::list<_Ty,_Alloc>::list(const std::list<_Ty, Alloc> &)' : cannot convert parameter 1 from 'TempType ( _cdecl *)(std::allocator < Ty> ( _cdecl *)(void))' 到 'const std::list<_Ty,_Alloc> &'”。看起来编译器将列表视为函数声明。知道为什么会这样吗?