gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:15 24 4
gpt4 key购买 nike

我在尝试使用采用自定义分配器的普通 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' 的左侧必须具有类/结构/union ”。当然 std::list 有一个构造函数,它接受对分配器的 const 引用。但是如果我把它改成:

std::list<int, std::allocator<int>> theList = std::list<int, std::allocator<int>>(std::allocator<int>());
theList.push_back(1);

一切顺利。为什么第二部分失败了?更奇怪的是,在尝试按值返回 theList 时:

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> &)':无法从'TempType (_cdecl *)(std::allocator<Ty> (_cdecl *)(void))' 到 'const std::list<_Ty,_Alloc> &'”。看起来编译器将列表视为函数声明。知道为什么会这样吗?

最佳答案

你遇到了the most vexing parse .编译器正在解析 theList(std::allocator<int>()) 的定义作为函数声明。这应该可以解决您的问题:

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

关于c++ - 尝试使用分配器构造 std::list 时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com