2017-10-05 14 views
6

Tôi vừa mới stumbled khi từ ngữ này từ cppreference:Chức năng có được chuyển tới std :: for_each được phép sao chép các phần tử chuỗi không?

Không giống như phần còn lại của các thuật toán, for_each không được phép làm bản sao của các yếu tố trong dãy số chẵn nếu họ trivially copyable.

Tuyên bố có đúng không? Tôi đã không tìm thấy bất kỳ căn cứ nào trong tiêu chuẩn. Tôi hiểu rõ, nó sẽ btw. ngụ ý ví dụ sau từ cùng một trang không hợp lệ?

struct Sum 
{ 
    Sum(): sum{0} { } 
    void operator()(int n) { sum += n; } 
    int sum; 
}; 

int main() 
{ 
    std::vector<int> nums{3, 4, 2, 8, 15, 267}; 
  
    // ... 
  
    // calls Sum::operator() for each number 
    Sum s = std::for_each(nums.begin(), nums.end(), Sum()); 
  
    // ... 
} 
+0

'std :: for_each' trả về khoảng trống, vì vậy việc này sẽ không biên dịch. Bạn đang tìm kiếm 'std :: accumulate' –

+3

Tôi sợ Bạn sai về điều này.Dù sao, đây không phải là điểm của câu hỏi và tôi không tìm kiếm bất kỳ giải pháp cụ thể nào. – neonxc

+0

Nó có thể là do việc thực hiện for_each có thể được viết mà không yêu cầu loại giá trị của các trình vòng lặp không tham chiếu đáp ứng yêu cầu của CopyConstructible. Nếu đó là trường hợp thì bạn không có guarrantee mã mà giả định loại là CopyConstructable sẽ làm việc. –

Trả lời

0

Các từ ngữ là thực sự khó hiểu, vì nó cũng được mentionned rằng

Chữ ký của hàm cần phải tương ứng như sau:
trống vui nhộn (const Loại & a);
Chữ ký không cần phải có const &.

Tôi nghĩ bạn cần thấy thực tế rằng for_each không được phép tạo bản sao của các yếu tố như một bảo đảm được đưa ra cho người dùng chứ không phải giới hạn về chức năng biến vị ngữ người dùng được áp dụng cho từng yếu tố.

+0

Chữ ký không cần phải có 'const &', bởi vì bạn có thể ommit 'const' chẳng hạn. Theo tôi, đây là một đoạn khá chung chung được sử dụng trên nhiều trang. – neonxc

+0

bạn có thể bỏ qua một hoặc cả hai. Tôi nghĩ rằng bạn hiểu lầm những gì tôi có nghĩa là bởi * nó * – UmNyobe

3

Câu đó trên cppreference.com xuất phát từ từ ngữ được thêm vào C++ 17 về hỗ trợ mới cho các thuật toán song song.

[algorithms.parallel.exec]/3 nói:

Trừ khi có quy định khác, triển khai có thể sao chép tùy tiện của các yếu tố (với loại T) từ chuỗi nơi is_trivially_copy_constructible_v<T>is_­trivially_­destructible_­v<T> là đúng sự thật.

Lưu ý đây là trong bối cảnh thảo luận các thuật toán song song, được định nghĩa là mẫu chức năng thư viện chuẩn có tham số mẫu có tên ExecutionPolicy.

Nhưng sau đó [alg.foreach]/9 nói về for_each(ExecutionPolicy&&, ForwardIterator, ForwardIterator, Function):

Triển khai không có quyền tự do được cấp theo [algorithms.parallel.exec] để làm bản sao tùy ý các yếu tố từ chuỗi đầu vào.

Có lẽ một số kỹ thuật song song có thể hiệu quả hơn cho các loại tầm thường bằng cách tạo bản sao của các phần tử. (Có lẽ để làm cho chúng tiếp giáp trong ký ức? Tôi chỉ đoán thôi.)

Vì vậy, không có điều nào trong số này áp dụng cho trường hợp không song song cũ hơn for_each(InputIterator first, InputIterator last, Function f). Đối với thuật toán đó, đơn giản là trường hợp do effects được chỉ định là "Áp dụng f cho kết quả của việc hủy đăng ký mọi trình lặp trong phạm vi [first, last) ...", đối số functor phải là *first và không phải là bản sao của *first.

+0

Cảm ơn bạn đã trả lời của bạn. Tôi tìm thấy nó rất nhiều thông tin. Mặt khác, câu trả lời của @ UmNyobe có lẽ phù hợp hơn với chủ đề của câu hỏi của tôi. Xin vui lòng không thực hiện điều này xấu. Tôi đánh giá cao nỗ lực của bạn. – neonxc

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