2016-07-18 22 views
6

Bir yineleme çiftini bekleyen bir işlev için tek bir değer girmeyi ve yalnızca bir çift yineleyiciyi bu değeri içeren bir aralıkta geçirmiş gibi davranmasını istiyorum. aşağıdaki gibiTek bir lvalue üzerinde yineleme

Benim yaklaşımdır:

#include <iostream> 
#include <vector> 

template<typename Iter> 
void iterate_over(Iter begin, Iter end){ 
    for(auto i = begin; i != end; ++i){ 
     std::cout << *i << std::endl; 
    } 
} 

int main(){ 
    std::vector<int> a{1,2,3,4}; 
    iterate_over(a.cbegin(), a.cend()); 

    int b = 5; 
    iterate_over(&b, std::next(&b)); 
} 

Bu g ++ 5.2 düzgün çalışması için görünür, ama bu aslında davranış tanımlanır merak ve ediyorum herhangi bir potansiyel sorunlar varsa?

+0

Yineleyici çiftleri ** aralıkları ** tanımlar. Konteynerler aralıkları oluşturmanın bir yoludur, ancak bunlar tek yol değildir. Yineleyicilerin bir kabın öğelerini işaret etmeleri gerekmez. –

+0

Teşekkürler, açıklık için soruyu düzenledik. – cloakedlearning

+0

Aşağıdakiler de dahil olmak üzere çok sayıda ilgili/yinelenen soru/cevap var: https://stackoverflow.com/questions/14505851/is-the-one-past-the-end-pointer-of-a-non-disney -type-a-geçerli-konsept-in-c, https://stackoverflow.com/questions/2405555/string-s-s1-legal-ub, https://stackoverflow.com/questions/21411102/treating-a -parça-nesne-gibi-bir-dizi-bir-eleman-alma-bir-son-uç-poi, vb – WhozCraig

cevap

11

Evet, bu tanımlanmış bir davranış. İlk [expr.add] 'den/Bu operatörlerin amacıyla 4

sahip nonarray nesneye bir işaretçi türüne uzunluğunda bir dizisinin ilk elemanı için bir işaretçi olarak aynı şekilde davranır nesne türü olarak nesne.

Böylece tek bir nesne Sonra sahip [expr.add]/5

[...] Ayrıca ifade p noktaları eğer uzunluğu 1 bir dizi olarak işlenir bir dizi nesnesinin son öğesi, (P) +1 ifadesi, dizi nesnesinin son öğesinden geçen bir nokta, ve Q ifadesi, bir dizi nesnesinin son öğesinin bir sonunu işaret ediyorsa, (Q) -1 noktaları dizi nesnesinin son öğesine. İşaretçi işleneni ve sonuç aynı dizi nesnesinin öğelerine işaret ediyorsa veya dizi nesnesinin son öğesinden geçmişse, değerlendirme bir taşma oluşturmaz; aksi halde davranış tanımsızdır.

Vurgu mayın

Yani ilk dizi öğesi de son dizi öğedir ve son dizi elemanına 1 ekleyerek yasal olmasından bağımsız olarak, nesnenin geçmiş birini verir çünkü.

İlgili konular