尝试使用Visual Studio 10编译以下程序,我得到了很多编译错误:
错误 1 错误 C2664: 'std::basic_string<_Elem, _Traits, _Ax>::basic_string(const std::basic_string<_Elem, _Traits, _Ax> &)':无法将参数 1 从 'const key_t' 转换为 'const std::basic_string<_Elem, _Traits, _Ax> &'。发生在此行:
奇怪的事情是,至少从我的角度来看,如果我更改这些行:
#include "stdafx.h"
#include <tuple>
#include <string>
#include <map>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::tuple<std::string, std::string> key_t;
typedef std::map<key_t, std::string> map_t;
map_t the_map;
auto k = std::make_tuple("one", "two");
the_map[k] = "the value";
auto q = std::make_tuple("one", "two");
auto i = the_map.find(q);
std::cout << i->second << std::endl;
return 0;
}
错误 1 错误 C2664: 'std::basic_string<_Elem, _Traits, _Ax>::basic_string(const std::basic_string<_Elem, _Traits, _Ax> &)':无法将参数 1 从 'const key_t' 转换为 'const std::basic_string<_Elem, _Traits, _Ax> &'。发生在此行:
这个错误发生在使用元组(tuple)时,因为参数类型不匹配。需要将参数转换为正确的类型。
std::cout << i->second << std::endl;
奇怪的事情是,至少从我的角度来看,如果我更改这些行:
auto k = std::make_tuple("one", "two");
the_map[k] = "the value";
为了
the_map[std::make_tuple("one", "two")] = "p";
程序已经编译通过。所以我的问题当然是为什么?我猜测这与make_tuple和移动语义有关,但我不明白具体是什么。
the_map[std::move(k)] = "the value"
,但这会“销毁”您的k
变量(如果您不知道我所说的“销毁”是什么意思,请查看一些关于移动语义的文章)。 - Tomaka17