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

时间:2017-01-07 00:49:09

标签: c++ string c++11 constructor std-pair

如果我想构造一个带有多于一个参数的构造函数的嵌入式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;
}

认为以上是使用“统一初始化列表”的正确语法,但这不适用于我的目的,因为我使用的是前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::pair的{​​{1}},然后调用operator=在对的成员。

1 个答案:

答案 0 :(得分:2)

只需写下

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}};

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

考虑以下示例

#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 )