关于c ++:尝试使用分配器构造std :: list时失败

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::list(const std::list&;)":无法将参数1从"诱人类型(_cdecl*)(std::allocator(_cdecl*)(void))"转换为"const 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>()));
//                                          ^                     ^