2015-03-23 12 views
5

Czy ten dostęp wielokrotny jest dozwolony?Czy ta wielokrotność uzyskuje dostęp do tego samego obiektu między punktami określającymi dobrze zdefiniowane zachowanie?

#include <iostream> 

int main() 
{ 
    int A[1]; 
    A[0] = 0; 
    A[A[0]] = 1; 
    std::cout << A[0]; 
} 

w paragrafie następnym ...

ile nie zaznaczono inaczej, kolejność oceny argumentów poszczególnych operatorów i podwyrażeń poszczególnych wyrażeń, a kolejność , w którym odbywają się skutki uboczne , nie jest określone. Pomiędzy poprzednim a następnym punktem sekwencji obiekt skalarny musi mieć swoją wartość zapamiętaną zmodyfikowaną co najwyżej jeden raz przez oszacowanie wyrażenia . Co więcej, wcześniejsza wartość jest dostępna tylko dla określającej wartość, która ma być przechowywana. Wymagania niniejszego paragrafu: są spełnione dla każdego dopuszczalnego uporządkowania podwyrażeń pełnego wyrażenia ; w przeciwnym razie zachowanie jest niezdefiniowane.

Jeśli używa starej wartości A [0], powinno być niezdefiniowane zachowanie, prawda?

+2

Skompilowany [tutaj] (http://ideone.com/VitzNp) dla każdego, kto chce grać. –

+2

Nie, jest bardzo zdefiniowany i wydrukuje 1 na ekranie – Bregalad

+7

@Ben To nie jest dowód, że nie jest niezdefiniowanym zachowaniem. –

Odpowiedz

8

Tak, jest ważny.

Przede wszystkim czytanie A[0] na LHS cesji jest całkowicie poprawny i dobrze zdefiniowane z tego samego powodu, że jest to:

int x = 42; 
x = x + 1; 

oba operandy muszą być ocenione przed przypisaniem mogą być wykonywane .

Po drugie, ocena A[A[0]] oddzielnie jest dość dobrze:

[C++11: 1.9/15]:[..] Obliczenia wartości operandów od operatora sekwencjonuje przed obliczania wartości wyniku dla operatora. [..]

w C++ 03 najbliżej związane sformułowanie mogę znaleźć jest następujący dotyczące przydziału (chociaż istnieją przykłady konstrukcji, takich jak a = a + x całym gafla):

[C++03: 5.17/8]: Jeśli wartość przechowywana w obiekcie jest dostępna z innego obiektu, który w jakikolwiek sposób pokrywa się z przechowywaniem pierwszego obiektu, to zakładka musi być dokładna, a dwa obiekty muszą mieć ten sam typ, w przeciwnym razie zachowanie jest niezdefiniowane.

+0

Dla celów pedantycznych, ponieważ istnieje wiele sklepów, które jeszcze nie używają C++ 11, czy istnieje odpowiednia deklaracja w poprzednim standardzie? Wszystko, co widzę do tej pory, pozwala mi wierzyć w C++ 98/03, to w rzeczywistości UB. –

+0

@MarkB: C++ 03 ma przykłady np. "a = a + x", ale znajdę dla ciebie konkretny cytat, jeśli będę mógł. –

Powiązane problemy