2012-04-20 41 views
5

Tôi đã viết đoạn mã sau để hiểu ngữ nghĩa di chuyển. Nó hoạt động như mong đợi (ví dụ: không có bản sao và chỉ di chuyển) trong g ++ - 4.6 nhưng không phải trong g ++ - 4.7.0. Tôi nghĩ rằng đó là một lỗi trong liên kết trong g ++ - 4.7.0 nhưng điều này link nói rằng nó không phải là một lỗi trong g ++ - 4.7. Vì vậy, như tôi đã hiểu từ liên kết trên, tôi đã tạo ra hàm khởi tạo di chuyển nhưng vẫn chỉ có bản sao. Tuy nhiên, nếu tôi tạo bản sao của hàm khởi tạo, chỉ di chuyển các địa điểm. Bất kỳ ai có thể giải thích điều này?vectơ, di chuyển ngữ nghĩa, nothrow và g ++ 4.7

#include <iostream> 
#include <vector> 
using namespace std; 

struct S{ 
int v; 
static int ccount, mcount; 
S(){} 
    //no throw constructor 
    //S(nothrow)(const S & x){ 
S(const S & x){ 
    v = x.v; 
    S::ccount++; 
} 
S(S&& x){ 
    v = x.v; 
    S::mcount++; 
} 
}; 

int S::ccount = 0; 
int S::mcount = 0; 
int main(){ 

vector<S> v; 
S s; 

for(int i = 0; i < 10; i++) { 
    v.push_back(std::move(s)); 
} 

cout << "no of moves = " << s.mcount << endl; 
cout << "no of copies = " << s.ccount << endl; 
return 0; 
} 

Trả lời

5

Làm thế nào để bạn "chuyển nhà xây dựng di chuyển"? Với g ++ 4.7, nếu tôi chú thích hàm khởi tạo di chuyển với noexcept thì ví dụ của bạn chỉ di chuyển:

S(S&& x) noexcept{ ... } 

no of moves = 25 
no of copies = 0 
+0

Cảm ơn. Tôi đã viết nó là 'S (nothrow) (S && ​​x) {....}'. Nhưng sau đó sự khác biệt giữa hai phiên bản "nothrow" này là gì? – suresh

+1

'noexcept' là từ khóa C++ 11 để đánh dấu một cái gì đó không phải là ném. Chữ ký bạn đã sử dụng khai báo một hàm được gọi là 'nothrow', lấy' S' bằng rvalue ref và trả về giá trị 'S'. –

+0

Điều đó giải thích tại sao đánh dấu hàm tạo bản sao theo cách này làm cho g ++ 4.7 sử dụng hàm khởi tạo di chuyển: lớp của bạn không còn ** có ** hàm tạo bản sao (nhưng hàm được gọi là 'nothrow'), vì g ++ 4.7 theo sau "don" t ngầm tạo ra một constructor sao chép nếu có một constructor di chuyển "rule", do đó, 'std :: vector' phải sử dụng hàm tạo di chuyển. –

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