以下程序仅在我将-DA=1
标志传递给编译器时进行编译:
#include <iostream>
#include <vector>
#include <algorithm>
struct element {
element() = default;
element(element&&) = default;
element& operator=(element&&) = default;
element(const element&) = delete;
element& operator=(const element&) = delete;
#if A
std::vector<int> v;
#endif
};
int main() {
std::vector<element> source(10), destination;
std::move(std::begin(source), std::end(source), std::back_inserter(destination));
}
如果传递-DA=0
,则编译失败并显示错误:
stl_algobase.h:373:4: error: static assertion failed: type is not assignable
使用GCC 4.9或Clang 3.4时失败。
成员变量的存在是否会影响显式默认构造函数的行为?
我正在为GCC和Clang使用stdlibc ++。使用Clang 3.4和libc ++时代码会编译。
答案 0 :(得分:4)
此std::move
版本为:
template<class InputIterator, class OutputIterator>
OutputIterator move(InputIterator first, InputIterator last,
OutputIterator result);
OutputIterator
属性由[output.iterators]定义,特别是以下表达式必须有效:
*r = o
其中r
是输出迭代器。
根据Coliru显示的错误消息,似乎库正在检查std::is_copy_assignable<element>
,这当然是错误的。
这似乎是一个错误;移动应该使用移动赋值运算符。
在同一个Coliru中比较以下内容:
int main() {
std::vector<element> e(1);
std::vector<element> d(1);
*e.begin() = std::move( *d.begin() ); // A=1 OK A=0 OK
std::move(d.begin(), d.end(), e.begin()); // A=1 OK A=0 errors
}
std::move
(3个参数)的定义包括每个索引执行*(result + n) = std::move( *(first + n) );
的定义。因此,如果我的第一行有效,那么我的第二行也应该有效。