gpt4 book ai didi

c++ - 填充 std::map 时为 "C2593: operator = is ambiguous"

转载 作者:可可西里 更新时间:2023-11-01 18:25:25 27 4
gpt4 key购买 nike

我有一个 std::map 我正在尝试使用初始化列表进行初始化。我在两个地方以两种不同的方式这样做。第一个有效,而另一个导致标题中提到的错误。

这是有效的:

void foo() {
static std::map<std::string, std::string> fooMap =
{
{ "First", "ABC" },
{ "Second", "DEF" }
};
}

虽然这个没有:

class Bar {
public:
Bar();
private:
std::map<std::string, std::string> barMap;
};

Bar::Bar() {
barMap = { // <-- this is the error line
{ "First", "ABC" },
{ "Second", "DEF" }
};
}

为什么在尝试初始化类成员时出现错误,而静态映射有效?目前,我可以通过首先创建一个局部变量然后将其与成员交换来填充成员,如下所示:

Bar::Bar() {
std::map<std::string, std::string> tmpMap = {
{ "First", "ABC" },
{ "Second", "DEF" }
};

barMap.swap(tmpMap);
}

但是,与直接填充成员相比,这感觉相当违反直觉。


编辑:Here's the compiler output.

最佳答案

这是编译器重载解析机制或其标准库实现中的错误。过载解析在 [over.ics.rank]/3 中明确指出

— List-initialization sequence L1 is a better conversion sequence than list-initialization sequence L2 if L1 converts to std::initializer_list<X> for some X and L2 does not.

在这里,Xstd::pair<std::string, std::string> . L1将您的列表转换为参数

map& operator=( std::initializer_list<value_type> ilist );

同时 L2将列表转换为以下函数的参数之一:

map& operator=( map&& other );
map& operator=( const map& other );

这显然不是 initializer_list秒。


你可以尝试使用

barMap = decltype(barMap){
{ "First", "ABC" },
{ "Second", "DEF" }
};

应该选择移动赋值运算符 ( Demo with VC++ )。临时文件也应该根据复制省略进行优化。

关于c++ - 填充 std::map 时为 "C2593: operator = is ambiguous",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26524250/

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