Xét đoạn mã sau:chuỗi s; &s+1; Pháp lý? UB?
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
string myAry[] =
{
"Mary",
"had",
"a",
"Little",
"Lamb"
};
const size_t numStrs = sizeof(myStr)/sizeof(myAry[0]);
vector<string> myVec(&myAry[0], &myAry[numStrs]);
copy(myVec.begin(), myVec.end(), ostream_iterator<string>(cout, " "));
return 0;
}
Quan tâm ở đây là &myAry[numStrs]
: numStrs bằng 5, do &myAry[numStrs]
điểm đến cái gì đó không tồn tại; phần tử thứ sáu trong mảng. Có một ví dụ khác về điều này trong đoạn mã trên: myVec.end()
, trỏ đến một đầu-cuối của véc tơ myVec
. Thật là hợp pháp về mặt pháp lý để lấy địa chỉ của yếu tố này không tồn tại. Chúng tôi biết kích thước của string
, vì vậy chúng tôi biết địa chỉ của phần tử thứ 6 của mảng kiểu C là string
phải trỏ đến. Vì vậy, miễn là chúng tôi chỉ đánh giá con trỏ này và không bao giờ dereference nó, chúng tôi đang tốt. Chúng ta thậm chí có thể so sánh nó với các con trỏ khác để bình đẳng. STL thực hiện điều này mọi lúc trong các thuật toán hoạt động trên một loạt các trình lặp. Các điểm vòng lặp end()
lặp lại kết thúc và các vòng lặp giữ vòng lặp trong khi bộ đếm != end()
.
Bây giờ xem xét việc này:
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
string myStr = "Mary";
string* myPtr = &myStr;
vector<string> myVec2(myPtr, &myPtr[1]);
copy(myVec2.begin(), myVec2.end(), ostream_iterator<string>(cout, " "));
return 0;
}
là mã này quy phạm pháp luật và được xác định rõ? Đó là hợp pháp và được xác định rõ ràng để lấy địa chỉ của một phần tử mảng qua cuối, như trong &myAry[numStrs]
, do đó, nó nên được hợp pháp và được xác định rõ ràng để giả vờ rằng myPtr
cũng là một mảng?
+1 cho độ chính xác kỹ thuật. Không chỉ dễ dàng để làm điều đó đúng, nhưng nó cũng tránh những cạm bẫy hơn nữa với 'toán tử &' đang bị quá tải (nó quá tệ để quá tải nó, vâng. Nhưng điều này cho thấy cách người ta chỉ kéo phụ thuộc vào). Tốt nhất để tránh được hành vi không xác định. –