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

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

我已经看到我正在尝试使用 void function 的确切语法,但我无法弄清楚为什么它在我的代码中不起作用:

构造函数:

 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 也超出了范围(这正是我想要的)。所以基本上,我知道解决方案,但我想知道为什么第一个代码不起作用。 P.S。错误是 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

  1. 解决方案是使用新的统一初始化语法而不是旧的对象初始化。不知道为什么,也许有人可以澄清一下。

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

The solution was to use the new Uniform Initialization syntax instead of the old Object Initialization. No Idea why, maybe someone could clarify.

听起来像 most vexing parse problem.

确实在您的代码中:

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

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

论文被错误强化:

error: expected ‘)’ before ‘{’ token

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

如您所知,一种解决方案是使用统一初始化语法。 那是因为代码不再含糊不清了。


That's a lot of down-votes for a legitimate question that nobody was able to answer.

我同意你的看法,因为反对票应该意味着评论以改进问题本身。

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