我有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);
}
然而,与仅直接填充成员相比,这感觉相当反直觉。
答案 0 :(得分:12)
这是编译器重载解析机制中的错误 - 或其标准库实现。 过载分辨率明确指出[over.ics.rank] / 3
- 列表初始化序列
L1
是一个更好的转换序列 如果L2
转换为列表初始化序列L1
某些std::initializer_list<X>
和X
的{{1}}没有。{/ p>
此处L2
为X
。 std::pair<std::string, std::string>
会将您的列表转换为参数
L1
虽然map& operator=( std::initializer_list<value_type> ilist );
将列表转换为以下函数的参数之一:
L2
显然不是map& operator=( map&& other );
map& operator=( const map& other );
s。
initializer_list
应选择移动赋值运算符(Demo with VC++)。临时也应该根据副本省略进行优化。