2010-07-01 31 views
11

Đối với một dự án cá nhân, tôi đã triển khai libstdC++ của riêng mình. Từng chút một, tôi đã thực hiện một số tiến bộ tốt đẹp. Thông thường, tôi sẽ sử dụng các ví dụ từ http://www.cplusplus.com/reference/ cho một số trường hợp kiểm tra cơ bản để đảm bảo rằng tôi có chức năng rõ ràng hoạt động như mong đợi.Điều này là bất hợp pháp phải không?

Hôm nay tôi chạy vào một vấn đề với std::basic_string::replace, đặc biệt với các phiên bản iterator dựa sử dụng ví dụ sao chép nguyên văn từ trang web (http://www.cplusplus.com/reference/string/string/replace/) (Tôi đã thêm một bình luận để chỉ ra các dòng trong câu hỏi):

// replacing in a string 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string base="this is a test string."; 
    string str2="n example"; 
    string str3="sample phrase"; 
    string str4="useful."; 

    // function versions used in the same order as described above: 

    // Using positions:    *123456789*12345 
    string str=base;    // "this is a test string." 
    str.replace(9,5,str2);   // "this is an example string." 
    str.replace(19,6,str3,7,6);  // "this is an example phrase." 
    str.replace(8,10,"just all",6); // "this is just a phrase." 
    str.replace(8,6,"a short");  // "this is a short phrase." 
    str.replace(22,1,3,'!');  // "this is a short phrase!!!" 

    // Using iterators:     *123456789* 
    string::iterator it = str.begin(); //^
    str.replace(it,str.end()-3,str3); // "sample phrase!!!" 

    // *** this next line and most that follow are illegal right? *** 

    str.replace(it,it+6,"replace it",7); // "replace phrase!!!" 
    it+=8;        //  ^
    str.replace(it,it+6,"is cool");  // "replace is cool!!!" 
    str.replace(it+4,str.end()-4,4,'o'); // "replace is cooool!!!" 
    it+=3;        //   ^
    str.replace(it,str.end(),str4.begin(),str4.end()); 
             // "replace is useful." 
    cout << str << endl; 
    return 0; 
} 

Trong phiên bản thay thế của tôi được triển khai theo chuỗi tạm thời mà tôi tạo sau đó trao đổi với *this. Điều này rõ ràng vô hiệu hóa bất kỳ trình lặp nào. Vậy tôi có đúng là ví dụ không hợp lệ không? bởi vì nó lưu trữ các trình vòng lặp, thay thế và sau đó sử dụng các trình lặp lại một lần nữa?

bản sao của tôi về tiêu chuẩn (ISO 14882: 2003 - 21.3p5) nói:

Tài liệu tham khảo, gợi ý, và lặp đề cập đến các yếu tố của một chuỗi basic_string có thể không còn giá trị bởi sau sử dụng các đối tượng basic_string:

- As an argument to non-member functions swap() (21.3.7.8), 
    operator>>() (21.3.7.9), and getline() (21.3.7.9). 
- As an argument to basic_string::swap(). 
- Calling data() and c_str() member functions. 
- Calling non-const member functions, except operator[](), at(), 
    begin(), rbegin(), 
    end(), and rend(). 
- Subsequent to any of the above uses except the forms of insert() and 
    erase() which return iterators, 
    the first call to non-const member functions operator[](), at(), begin(), 
    rbegin(), end(), or rend(). 

mục về hàm thành viên không const dường như để bù đắp này. Vì vậy, trừ khi tôi đang thiếu một cái gì đó, sau đó mã này đang sử dụng iterators không hợp lệ phải không? Tất nhiên, mã này hoạt động tốt với libstdC++ của gcc, nhưng tất cả chúng ta đều biết rằng không chứng minh được sự tuân thủ các tiêu chuẩn.

+13

Điều này thực tế là bất hợp pháp và tôi đã thông báo cho FBI. Tôi hy vọng bạn có một luật sư tốt. –

+0

Họ sẽ cần xây thêm nhà tù, eep. –

+1

Nếu bạn tự hỏi về điều này - đừng tự hỏi. cplusplus.com có ​​đầy đủ các lỗi. –

Trả lời

2

Điều này có vẻ như hoạt động nếu replace hoạt động tại chỗ. Tôi không nghĩ rằng nó được yêu cầu phải được thực hiện theo cách đó mặc dù. Vì vậy, có, tôi sẽ nói mã của bạn là kỹ thuật bất hợp pháp.

Các vấn đề liên quan