如果我想构造一个带有多于一个参数的构造函数的嵌入式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=
在对的成员。
答案 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 )