此不有效:
#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);
为什么这个简单的程序无法编译?
答案 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对此代码没有任何问题。