2014-10-14 18 views
5

Это не работы:Почему эта простая программа, использующая std :: rotate, не компилируется?

#include <algorithm> 

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

Ошибки я получаю:

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

Это явно неправильное поведение, как декларация поворота является:

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

Почему эта простая программа не скомпилируется?

+2

Прежде чем C++ 11, 'rotate' ничего не вернул. По-видимому, ваша стандартная реализация библиотеки не совсем обновлена. –

+3

Это известная проблема (https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x) для libstdC++ ("rotate возвращает void."). – user657267

ответ

3

Это выглядит как libstdc++ вопрос мы можем увидеть это, выполнив тест с использованием как libstdc++ и libc++ и мы можем видеть, что это не удается только тогда, когда мы используем libstdc++.

Использование Rextesters online compilers делает быстрый тест довольно простым, libc++ live version не вызывает ошибок. В то время как libstdc++ live version генерирует следующее сообщение об ошибке:

error: variable has incomplete type 'void'

Если мы посмотрим на запись cppreference для std::rotate мы можем увидеть предварительный вариант C++ 11 действительно возвращенное 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) 

Как указано выше в комментариях это очевидно known bug:

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

Кроме того, возможно, стоит отметить, Visual Studio не имеет р с этим кодом.

Смежные вопросы