Saya mencari standar C++ di N3485 25.3.1 [alg.copy], yang mendefinisikan 4 algoritma:
copy
copy_backward
copy_if
copy_n
Dalam deskripsi copy
, ada catatan ini 25.3.1 [alg.copy]/3:
Membutuhkan: hasil tidak boleh berada dalam rentang [pertama, terakhir)
Artinya, copy
tidak selalu berfungsi dengan benar ketika rentangnya tumpang tindih (mirip dengan memcpy
).
copy_backward
dan copy_if
memiliki bahasa serupa yang melarang rentang yang tumpang tindih (masing-masing 25.3.1 [alg.copy]/14 dan 25.3.1 [alg.copy]/8).
Namun, tidak ada larangan untuk copy_n
, dan tidak ada copy_n_backward
. Apakah ini berarti copy_n
melakukan hal yang benar ketika rentangnya tumpang tindih?
(Implementasi MSVC++ terhadap copy_n
tampaknya didelegasikan ke std::memmove
, jadi saya tahu ini aman di sini di MSVC++ 2013. Namun saya tidak ingin bergantung pada ini jika standar menyatakan sebaliknya)
copy_n
tampaknya didelegasikan kestd::memmove
Perhatikan bahwa kami hanya melakukan ini jika transformasi tersebut benar; yaitu, di mana iterator adalah penunjuk ke objek yang dapat disalin secara sepele. - person James McNellis   schedule 23.12.2013std::list
iterator, ini tidak aman pada implementasi MSVC++. Kedengarannya seperti jawaban bagiku... - person Billy ONeal   schedule 23.12.2013copy_n
. Saya tidak tahu mengapa ini tidak ada dalam Standar. Anda bisa menyampaikan masalah. BTW,copy
hanya melarang tumpang tindih yang keluarannya dimulai dalam rentang masukan, tetapi berfungsi dengan baik ketika rentang keluaran berakhir dan dalam rentang masukan (yaitu menyalin ke kiri). - person TemplateRex   schedule 04.01.2014