它无效的原因与无效的原因完全相同:
std::pair<const int, std::pair<int, int>> p{1, 1, 1};
因为上面的内容本质上就是地图的内容emplace
归结为。
为了使其工作,您可以使用piecewise_construct的构造函数std::pair http://en.cppreference.com/w/cpp/utility/pair/pair,正是为了这个目的而引入的:
m.emplace(
std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(1, 1)
);
这将达到不调用任何不必要的构造函数的预期效果(即使它们可能会被省略)。
回答有关使“直接”语法起作用的假设问题:在一般情况下,任意map<K, V>
, 不。想象一下:
struct Proof {
Proof(int);
Proof(int, int);
};
std::map<Proof, Proof> m;
m.emplace(1, 1, 1); // Now what?
你当然可以让它在有限的情况下工作map<T, std::pair<T, T>>
。在以下方面的帮助下,对于更一般的事情也可能是可行的massive大量的高级模板技巧(想想SFINAE https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error左、右、中,然后是一些)。这是否值得取决于您的具体情况。