为什么这个简单的程序使用std :: rotate不能编译?

时间:2014-10-14 01:43:24

标签: c++ c++11 std

有效:

#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 个答案:

答案 0 :(得分:6)

在C ++ 11之前,std::rotate used to return void。因此,您很可能采用非C ++ 11兼容的实现方式。

答案 1 :(得分:3)

这看起来像libstdc++问题我们可以通过使用libstdc++libc++进行测试来看到这一点,我们可以看到它只在我们使用libstdc++时失败

使用Rextesters online compilers使快速测试变得非常简单,libc++ live version不会产生任何错误。 libstdc++ live version生成以下错误:

  

错误:变量的类型'void'不完整

如果我们查看std::rotate的cppreference条目,我们可以看到pre 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对此代码没有任何问题。