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
}