В N3059 я нашел описание кусочного построения пар (и кортежей) (и это есть в новом Стандарте).
Но я не вижу, когда я следует использовать это. Я нашел дискуссии о emplace и некопируемых объектах, но когда я попробовал это, я не смог создать случай, когда мне нужен piecewiese_construct
или я мог бы увидеть повышение производительности.
Пример. Я думал, что мне нужен класс, который не копируется , но movebale (требуется для пересылки):
struct NoCopy {
NoCopy(int, int) {};
NoCopy(const NoCopy&) = delete; // no copy
NoCopy& operator=(const NoCopy&) = delete; // no assign
NoCopy(NoCopy&&) {}; // please move
NoCopy& operator=(NoCopy&&) {}; // please move-assign
};
Я тогда вроде как ожидал, что стандартное построение пар не удастся:
pair x{ NoCopy{1,2}, NoCopy{2,3} }; // fine!
, но этого не произошло. На самом деле, это то, что я ожидал в любом случае, потому что «перемещать вещи», а не копировать их повсюду в stdlib, так и должно быть.
Таким образом, Я не вижу причин, почему мне следовало это сделать, или около того:
pair y(
piecewise_construct,
forward_as_tuple(1,2),
forward_as_tuple(2,3)
); // also fine
piecewise_construct
?