std::move
ve std::forward
arasındaki ayrım iyi bilinir, iletilen bir nesnenin değer kategorisini korumak için ikincisini kullanırız ve hareket semantiğini etkinleştirmek için yeniden referansa yayınlanacak olanları kullanırız. ++ etkili Modern C'deNeden std :: forward kullanmıyorsunuz?
, bir kılavuz var olduğunu devletler
aşağıdaki senaryoda Oysarvalue referanslar, evrensel referanslara
std::forward
üzerinde kullanımstd::move
.a
bir yönlendirme referansı ancak basit rvalue referans değil (biz değer kategorisini değiştirmek istemiyorum ve senaryolar)
,
template <class T>
void f(vector<T>&& a)
{
some_func(std::move(a));
}
, kalmasın diye Aşağıdakileri yapmak tam olarak aynı mı? Bu yana
template <class T>
void f(vector<T>&& a)
{
some_func(std::forward<decltype(a)>(a));
}
kolayca #define FWD(arg) std::forward<decltype(arg)>(arg)
hep şöyle bu makro tanımını kullanmak daha uygun değil, böyle bir makro içinde muhafaza edilebilir?
void f(vector<T>&& a)
{
some_func(FWD(a));
}
Tam olarak eşdeğer yazmanın iki yolu değil mi?
Makro çözümünü 'move()' yazmasından daha uygun olarak görüntülemede sorun yaşıyorum ...ama bu bana fikir temelli bir soru olarak vuruyor. Her ikisi de – Barry
aynı şeyi yapar ama bir kez argüman düzenli bir referanstır ve vektörü taşımak istersiniz. iletmeyi kullanmaya devam et, –
@Barry'nin eşdeğerde onayı olmasını istedim, bunun için de thnx. Düşüncelere dayalı olup olmadığına, sadece bir programlama stilini savunmanın önyargıya işaret etmediğine, birisinin bunu yapmak için çok iyi nedenlere sahip olabileceğine (ve onlarla ilgili ayrıntılı bilgi verebileceklerine) katılıyorum. –