在空和非空结构中明确默认的构造函数

Sta*_*ked 9 c++

仅当我将-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));
}
Run Code Online (Sandbox Code Playgroud)

如果-DA=0传递,则编译失败并显示错误:

stl_algobase.h:373:4: error: static assertion failed: type is not assignable
Run Code Online (Sandbox Code Playgroud)

看看Coliru吧.

使用GCC 4.9或Clang 3.4时失败.

成员变量的存在是否会影响显式默认构造函数的行为?

更新

我正在为GCC和Clang使用stdlibc ++.使用Clang 3.4和libc ++时代码会编译.

M.M*_*M.M 4

这个版本std::move是:

template<class InputIterator, class OutputIterator>
    OutputIterator move(InputIterator first, InputIterator last,
    OutputIterator result);
Run Code Online (Sandbox Code Playgroud)

OutputIterator属性由 [output.iterators] 定义,特别是以下表达式必须有效:

*r = o
Run Code Online (Sandbox Code Playgroud)

其中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
}
Run Code Online (Sandbox Code Playgroud)

(3 个参数)的定义std::move包括它执行的每个索引的定义*(result + n) = std::move( *(first + n) );。因此,如果我的第一行有效,那么我的第二行也应该有效。