如何用std::initializer_list<std::string_view>在构造函数成员初始化列表初始化std::list<Player>
关于C++中std::list初始化与参数类型选择的问题
背景与参数选择疑问
- 现有
Game类,其数据成员m_players类型为std::list<Player>;Player结构体包含std::string类型的m_name成员。 - 希望实例化
Game时支持传入任意数量的玩家名称,且兼容字符串字面量和std::string类型,因此选择std::string_view作为参数类型,并用std::initializer_list作为构造函数的参数,想确认这两个选择是否合理。
代码与错误情况
编写的代码如下:
#include <iostream> #include <string> #include <list> struct Player { Player (std::string_view name) : m_name{name} {} private: std::string m_name; }; class Game { public: Game(const std::initializer_list<std::string_view> players) // 错误提示:no matching function for call to 'std::__cxx11::list<Player>::list(<brace-enclosed initializer list>)' : m_players{players} {} private: std::list<Player> m_players; }; int main() { Game game1{"Ann", "Bob"}; std::string name1{"Ann"}; std::string name2{"Bob"}; Game game2{name1, name2}; }
尝试在成员初始化列表中直接用players初始化m_players时触发上述错误,目前已知两种可行解决方案:
- 在构造函数体内遍历
initializer_list,调用m_players.emplace_back(player); - 使用固定数量的
std::string_view作为构造函数参数,替代std::initializer_list。
疑问点
- 成员初始化列表中直接初始化失败的具体原因是什么?猜测可能涉及隐式转换,但不确定细节。
- 成员初始化列表初始化和构造函数体内循环的性能是否真的没有差异?
内容的提问来源于stack exchange,提问作者Rob Lauer
相关产品推荐
相关产品推荐

