这是 C++11 发起器的新语法吗?

Is this a new syntax of C++11 initalizer?

本文关键字:语法 新语法 C++11 这是      更新时间:2023-10-16
MySQLRouter::MySQLRouter(const int argc, char **argv)
: MySQLRouter(Path(argv[0]).dirname(),
              vector<string>({argv + 1, argv + argc}))
{
}

"vector({argv + 1, argv + argc})"是什么意思?

附言对不起这个简单的问题。我真的不知道语法名称,所以我无法谷歌搜索它。

vector<string>({argv + 1, argv + argc})

从参数构造vector<string> {argv + 1, argv + argc},并使用该参数使用 Move 构造函数构造第二个vector<string>。第二个对象传递给 MySQLRouter 的第二个构造函数。

您也可以使用更简单的形式:

vector<string>{argv + 1, argv + argc}

vector<string>(argv + 1, argv + argc)

这将仅构造一个临时对象。

话虽如此,使用

vector<string>({argv + 1, argv + argc})

不会因使用 Move 构造函数而导致任何性能损失。

下面是演示上述行为的简单测试程序:

#include <iostream>
#include <vector>
#include <string>
void test(std::vector<std::string> const& v)
{
   for ( auto const& item : v )
   {
      std::cout << item << std::endl;
   }
   std::cout << std::endl;
}
int main(int argc, char** argv)
{
   test(std::vector<std::string>({argv+1, argv+argc}));
   test(std::vector<std::string>(argv+1, argv+argc));
   test(std::vector<std::string>{argv+1, argv+argc});
}

当程序运行时:

./socc aa bb cc

我得到以下输出:

aa
bb
cc
aa
bb
cc
aa
bb
cc