c++ - 4.4 和 4.7 之间 C++ STL 容器初始化器列表行为的差异

标签 c++ stl c++11 initializer-list

以下 c++0x/c++11 功能(初始化列表,包括 STL 容器)应该允许我在声明时初始化此 STL std::map。而且,它在 g++ 4.7.2 中工作得很好,但在尝试在 g++ 4.4.6 中编译它时出现错误。根据 GCC 文档,这个 c++0x 功能在 4.4 中可用,但显然要么 (a) 我做错了什么,要么 (b) 它在 g++ 4.4 中不完整。

std::map<std::string,std::vector<std::string>>
DbConnection::attrs_of_type = {
    { "http",           { "url", "ipaddress", "port",
                            "username", "password" } },
    { "email",          { "address", "full_name" } },
    { "ftp",            { "hostname", "ipaddress", "port",
                            "username", "password", "filename" } }
};

但是,当我尝试在 gcc 4.4.6 下进行编译时,我收到以下无匹配函数调用错误,这是典型的“几乎无法理解”方式:

database.cc:164: error: no matching function for call to ‘std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::map(<brace-enclosed initializer list>)’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:195: note: candidates are: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::initializer_list<std::pair<const _Key, _Tp> >, const _Compare&, const _Alloc&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:181: note:                 std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:170: note:                 std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:150: note:                 std::map<_Key, _Tp, _Compare, _Alloc>::map() [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]

(是否可以更改粘贴的格式,以便不需要太多的水平滚动?)

无论如何。此时,我正在尝试找出必须采取哪些不同措施才能使此初始化在 g++ 4.4.6 中工作。我可以改变声明 std::mapstd::vector 的方式来解决问题吗?或者由于 g++ 4.4 中此 c++11 功能的不同和/或不完整实现,必须使用完全不同的方法?

最佳答案

您的代码是正确的。 g++-4.4 正式支持初始化列表。但我记得(我关注 wg21 论文)有人担心,特别是无法以您在委员会中所做的方式(嵌套)初始化容器。

由于这些更改是后来完成的,g++-4.4 可能没有完全支持 std::initializer_list 语法。

关于c++ - 4.4 和 4.7 之间 C++ STL 容器初始化器列表行为的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13400819/

相关文章:

c++ - 无法理解使用 C++ STL 的 Stock 跨度的线性时间方法

c++ - STL映射查找线程安全

c++ - 使用 C++ 导航 XAML 页面

c++ - 在 C++11 的一个表达式中对同一个变量进行双重赋值

c++ - 如何在 C++ 中将字符串拆分为不同的数据类型

c++ - 为什么 ucontext 有这么高的开销?

c++ - 如何修复无限运行的嵌套 while 循环?

c++ - 类型 'std::istream*' 和 'char' 到二进制 'operator>>' 的无效操作数

c++ - 非常简单的程序通过了 VS2010 c++ 内存泄漏检查器,但在销毁所有对象后在程序结束时仍然使用更多内存?

c++ - make_shared如何为manager object和managed object分配单个动态内存