2014-10-14 19 views
5

này không công việc:Tại sao chương trình đơn giản này sử dụng std :: rotate không biên dịch?

#include <algorithm> 

int main() 
{ 
    int a[] = { 1, 2, 3 }; 
    auto it = std::rotate(std::begin(a), std::begin(a) + 1, std::end(a)); 
} 

Các lỗi tôi nhận được là:

main.cpp:6:10: error: variable has incomplete type 'void' 
    auto it = std::rotate(std::begin(a), std::begin(a) + 1, std::end(a)); 

Đây rõ ràng là hành vi không đúng, như tuyên bố xoay là:

template<class ForwardIterator> 
    ForwardIterator rotate(ForwardIterator first, ForwardIterator middle, 
      ForwardIterator last); 

Tại sao chương trình đơn giản này không biên dịch được không?

+2

Trước khi C++ 11, 'rotate' không trả về bất kỳ thứ gì. Rõ ràng việc triển khai thư viện chuẩn của bạn chưa hoàn toàn cập nhật. –

+3

Đó là [vấn đề đã biết] (https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x) cho libstdC++ ("xoay trả về void."). – user657267

Trả lời

3

này trông giống như một vấn đề libstdc++ chúng ta có thể thấy điều này bằng cách thực hiện một thử nghiệm sử dụng cả hai libstdc++libc++ và chúng ta có thể nhìn thấy nó chỉ thất bại khi chúng ta đang sử dụng libstdc++.

Sử dụng Rextesters online compilers làm cho thử nghiệm nhanh chóng khá đơn giản, libc++ live version không phát sinh lỗi. Trong khi libstdc++ live version tạo ra các lỗi sau:

error: variable has incomplete type 'void'

Nếu chúng ta nhìn vào entry cppreference cho std::rotate chúng ta có thể thấy trước C++ 11 phiên bản thực sự trở void:

template< class ForwardIt > 
void rotate(ForwardIt first, ForwardIt n_first, ForwardIt last) (until C++11) 

template< class ForwardIt > 
ForwardIt rotate(ForwardIt first, ForwardIt n_first, ForwardIt last); (since C++11) 

Như đã nêu ở trên trong các ý kiến này rõ ràng là một known bug:

25.3 | Mutating sequence operations | Partial rotate | returns void. 

Ngoài ra, có lẽ đáng chú ý Visual Studio không có p các biểu tượng với mã này.

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