[英]Emplace directly in std::map of pair
為什么此代碼無法編譯?
std::map<int,std::pair<int,int>> m;
m.emplace(1,1,1);
假設我們可以編輯std::map::emplace
的代碼,是否可以更改它以使先前的代碼有效?
出於無效的完全相同的原因而無效:
std::pair<const int, std::pair<int, int>> p{1, 1, 1};
由於上述的實質是什么地圖的emplace
歸結為。
要使其工作,可以使用std::pair
的piecewise_construct
構造函數,正是出於這個目的而引入的:
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>>
的有限情況。 在大量高級模板技巧的幫助下(對於SFINAE左,右和中心,然后再進行一些操作),對於更通用的方法也是可行的。 這是否值得,取決於您的具體情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.