使用非 1 参数 ctor 初始化嵌入 std::pair 中的 std::string?

Initializing std::string embedded in std::pair with non-1-argument ctor?

如果我想用一个接受超过 1 个参数的构造函数构造嵌入式 std::string,是否可以构造一个 std::pair?

例如,这是合法的:

#include <iostream>
#include <utility>
#include <string>

int main()
{
  std::pair<int, int> pair(2, 3);
  return 0;
}

...这是合法的:

#include <iostream>
#include <utility>
#include <string>

int main()
{
  std::pair<int, std::string> pair(2, "hello");
  return 0;
}

...但我想知道是否可能出现以下情况:

#include <iostream>
#include <utility>
#include <string>

int main()
{
  std::pair<int, std::string> pair{2, {"hello", 3}}; //Unclear if some variation/combination of parentheses and curly braces can make this legal.
  return 0;
}

认为 以上是使用 "uniform initializer lists" 的正确语法,但这对我的目的不起作用,因为我使用的是 C++ 之前的版本11 编译器。有什么方法可以使用 C++11 之前的语法实现这一点吗?

为了澄清,我正在尝试使用这个 std::string 构造函数:

basic_string( const CharT* s,
              size_type count,
              const Allocator& alloc = Allocator() );

作为我问这个问题的背景,这是出于学术好奇(如果错误请纠正我):我认为像这样进行单行构造更有效,因为 std::pair 及其成员是简单地一次性创建和初始化。而如果我做了这样的事情(使用 C++11 语法)...

#include <iostream>
#include <utility>
#include <string>

int main()
{
  std::pair<int, int> pair(2, 3);
  std::pair<int, std::string> pair2 = {2, {"hello", 3}};
  return 0;
}

...然后我在技术上创建一个 std::pair<int, std::string> 其成员是默认构造的,然后调用 std::pairoperator=,然后调用 operator= 对成员。

随便写:

std::pair<int, std::string> pair( 2, std::string( "hello", 3 ) ); 

关于这个声明:

std::pair<int, std::string> pair2 = {2, {"hello", 3}};

那么实际上相当于这个声明:

std::pair<int, std::string> pair{2, { "hello", 3}};

由于复制构造函数省略。考虑到没有赋值运算符,因为它是一个声明。

考虑以下示例:

#include <iostream>
#include <string>

int main()
{
    struct Pair
    {
        std::string s;
        int i;
        Pair(int i, const std::string &s) : i(i), s(s)
        {
            std::cout << "Pair( int, std::string )" << std::endl;
        }

        Pair( const Pair &p) : i(p.i), s(p.s)
        {
            std::cout << "Pair( const Pair & )" << std::endl;
        }
    };

    Pair p1{ 2, { "hello", 3 } };
    Pair p2 = { 2, { "hello", 3 } };
}

程序输出为:

Pair( int, std::string )
Pair( int, std::string )