C++ 空和非空结构中的显式默认构造函数
仅当我将C++ 空和非空结构中的显式默认构造函数,c++,C++,仅当我将-DA=1标志传递给编译器时,以下程序才会编译: #include <iostream> #include <vector> #include <algorithm> struct element { element() = default; element(element&&) = default; element& operator=(element&&) = default;
-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));
}
使用GCC 4.9或Clang 3.4时失败
成员变量的存在是否会影响显式默认构造函数的行为
更新
我对GCC和Clang都使用stdlibc++。代码在使用Clang3.4和libc++时编译 此版本的
std::move
是:
template<class InputIterator, class OutputIterator>
OutputIterator move(InputIterator first, InputIterator last,
OutputIterator result);
其中,r
是输出迭代器
根据Coliru显示的错误消息,库似乎正在检查std::is\u copy\u assignable
,这当然是错误的
这似乎是一个错误;移动应该使用移动赋值操作符工作
在同一列中比较以下各项:
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
}
intmain(){
std::载体e(1);
std::载体d(1);
*e、 begin()=std::move(*d.begin());//A=1正常A=0正常
std::move(d.begin(),d.end(),e.begin());//A=1确定A=0错误
}
std::move
(3个参数)的定义包括它对每个索引执行的*(result+n)=std::move(*(first+n))代码>。因此,如果我的第一行是有效的,那么我的第二行也应该是有效的。自我推销。。。tsk tsk tsk。。。如果使用libc++而不是libstdc++,则在g++4.8.3中可以正确编译这两种语言ways@Praetorian。Coliru上的错误消息表明问题出在std::is\u copy\u assignable
NB。我不确定为什么库只在A=0的情况下检查是否复制\u可分配
,可能是在stl\u algobase.h
等中拖网required@JonathanWakely应该能够像他那样回答这个问题。
*r = o
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
}