在调用类构造函数时初始化std::map

Initializing std::map in a call to a class constructor

本文关键字:std map 初始化 调用 构造函数      更新时间:2023-10-16

我已经看到了我正在尝试的void函数的确切语法,但我无法弄清楚为什么它在我的代码中不工作:

构造函数:

 class Input
 {
 public:
    Input(const std::map<std::string, void(*)(void)> &arg_0)
      { //...code...// }
 };

使用临时std::map:

调用构造函数
  Input  _Input(
    std::map<std::string, void(*)(void)> {
      {"exit", [](){exit(1);}}
    }
  );

同样,只要稍微改变

std::map<std::string, void(*)(void)> NAME = {
  {"exit", [](){exit(1);}
}

足以解决问题,并且由于某种原因,NAME也超出了作用域(这正是我想要的)。所以基本上,我知道解决方案,但我想知道为什么第一个代码不起作用。注:错误是 error: expected ‘)’ before ‘{’ token IN std::map<std::string, void(*)(void)> {

<标题>编辑:我明白了,调用构造函数的确切方式显然很重要:
class BackEnd
{
private:
  Input  _Input(
    std::map<std::string, void(*)(void)> {
      {"exit", [](){exit(1);}}
    }
  );
};

在这种情况下,它停止工作并抛出错误。例如:https://ideone.com/ikGUGF

解决方案是使用新的统一初始化语法代替旧的对象初始化。不知道为什么,也许有人能解释一下。

这听起来像是最令人烦恼的解析问题

确实在你的代码中:

Input  _Input(
  std::map<std::string, void(*)(void)> {
  // -----------------------------------^
      {"exit", [](){exit(1);}}
    }
 );

Input _Input(...)可以被解释为函数定义,因此,由于标准,编译器可以这样做。

这个论点被下面的错误强化了:

error: expected ‘)’ before ‘{’ token

这是因为编译器需要一个)来关闭函数的签名。

正如您已经发现的,一种解决方案是使用统一初始化语法。这是因为代码不再有歧义了。

对于一个没有人能回答的合理问题,有很多人投了反对票。

我同意你的观点,因为一个不同意的投票应该意味着一个评论,以改善一个问题本身。

无论如何,我希望你能找到有用的答案。

  1. 解决方案是使用新的统一初始化语法代替旧的对象初始化。不知道为什么,也许有人能解释一下。

  2. 对于一个没有人能够回答的合法问题,这是很多的反对票。