簡體   English   中英

直接放置在對的std :: map中

[英]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::pairpiecewise_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM