기본적으로 std::stack
의 "기본 컨테이너"는 std::deque
입니다. 따라서 어떤 std::deque
에 대한 정의되지 않은 동작은 std::stack
에 대해 정의되지 않은 동작입니다. cppreference 및 기타 사이트에서는 멤버 함수의 동작을 설명 할 때 "효과적으로"라는 용어를 사용합니다. 나는 그것이 모든 의도와 목적을위한 것이라고 생각합니다. 따라서 top()
및 pop()
을 호출하는 것은 back()
및 pop_back()
을 호출하는 것과 동일하며 빈 컨테이너에서 호출하는 것은 정의되지 않은 동작입니다.STL에서 정의되지 않은 동작이 허용되는 이유는 무엇입니까?
내 이해에서, 그것이 정의되지 않은 이유는 no-throw 보증을 유지하는 것입니다. 내 논리에 따르면 std::vector
에 대한 operator[]
은 no-throw 보증을 가지고 있으며 컨테이너 크기가 N보다 크지 만 at()
은 강력한 보증을 갖고 정의되지 않은 동작이며 n이 범위를 벗어난 경우 std::out_of_range
을 던졌습니다.
내 질문에, 가능성이 정의되지 않은 동작을 가지고 있고 강력한 보장을 가지고 있지만 대신 예외를 던지거나 던지기 보증을하는 몇 가지 이유에 대한 근거는 무엇입니까?