尝试使用分配器构造std :: list时失败

时间:2013-04-17 19:29:10

标签: c++ visual-studio-2012 stl

我尝试使用普通的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:'。put_back'的左边必须有class / struct / union”。当然std :: list有一个构造函数,它对分配器进行const引用。但如果我把它改为:

std::list<int, std::allocator<int>> theList = std::list<int, std::allocator<int>>(std::allocator<int>());
theList.push_back(1);
一切都很好。为什么第二部分失败了?为了增加这种情况的陌生感,当试图按值返回List时:

typedef std::list<int, std::allocator<int>> TempType;

TempType func()
{
    TempType theList(std::allocator<int>());
    return theList;
}

我得到“错误C2664:'std :: list&lt; _Ty,_Alloc&gt; :: list(const std :: list&lt; _Ty, Alloc&gt;&amp;)':无法从'TempType(<)中转换参数1 / em> _cdecl *)(std :: allocator&lt; Ty&gt;( _cdecl *)(void))'到'const std :: list&lt; _Ty,_Alloc&gt;&amp;'“。看起来编译器将列表视为函数声明。知道为什么会这样吗?

2 个答案:

答案 0 :(得分:5)

您已遇到the most vexing parse。编译器将theList(std::allocator<int>())的定义解析为函数声明。这应该可以帮到你:

std::allocator<int> alloc;
std::list<int, std::allocator> > theList(alloc);

答案 1 :(得分:3)

它被称为the most vexing parse

您不小心声明了功能。添加一组额外的括号将使其明确无误。

std::list<int, std::allocator<int>> theList((std::allocator<int>()));
//                                          ^                     ^