Sicher meinst du v[...]
statt v()
; std::vector
hat keine operator(int)
.
Wie dem auch sei, empirisch,
#include <iostream>
using namespace std;
int main(){
unsigned foo = 1;
cout<<(-1)*foo<<'\n';
cout<<-foo<<'\n';
cout<<foo*(-1)<<'\n';
cout<<static_cast<int>(-foo)<<'\n';
cout<<static_cast<int>(foo)*-1<<'\n';
}
ergibt:
4294967295
4294967295
4294967295
-1
-1
ergo eine negierte unsigned oder ohne Vorzeichen mit -1 überläuft, multipliziert mit um seinen Maximalwert Einwickeln (dies sollte das theoretische Verhalten sein zu).
Als size_t zu http://en.cppreference.com/w/cpp/container/vector/operator_at, wenn zufällig std::vector<T>::size_type
nicht size_t
ist (unwahrscheinlich, aber möglich), size()
sollte sicher führen innerhalb der Grenzen des Vektors ein size_t
vorbei und nicht zu UB für die Weitergabe, wie size_t
groß sein muss, genug, um ein Array beliebiger Größe zu indexieren.
'Vektor' Indizes sind 'Vektor :: size_type' in Typ, der ist * in der Regel *' size_t', aber Sie * sollten * 'size_type' anstelle von' size_t' direkt verwenden. –
@RemyLebeau Ist das gleich wie size_t? – user1899020
'size_type' ist definiert als:" size_type kann jeden nicht negativen Wert von difference_type darstellen ". Und "difference_type" ist: "identisch mit dem Unterschiedstyp von X :: iterator und X :: const_iterator". Das heißt, dass es sich um einen Typ handelt, der den Unterschied zwischen zwei beliebigen Adressen im Vektor darstellen kann. 'size_t' muss per Definition diese Anforderung erfüllen. –