首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在空和非空结构中显式默认的构造函数

在空和非空结构中显式默认的构造函数
EN

Stack Overflow用户
提问于 2014-07-09 08:54:33
回答 1查看 151关注 0票数 9

仅当我将-DA=1标志传递给编译器时,以下程序才会编译:

代码语言:javascript
运行
复制
#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,则编译将失败,并显示以下错误:

代码语言:javascript
运行
复制
stl_algobase.h:373:4: error: static assertion failed: type is not assignable

Check it out on Coliru.

使用GCC 4.9或Clang 3.4失败。

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

更新

我在使用stdlibc++的时候,同时使用了stdlibc++的两个版本。代码在使用Clang3.4和libc++时进行编译。

EN

回答 1

Stack Overflow用户

发布于 2014-07-09 09:39:58

此版本的std::move为:

代码语言:javascript
运行
复制
template<class InputIterator, class OutputIterator>
    OutputIterator move(InputIterator first, InputIterator last,
    OutputIterator result);

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

代码语言:javascript
运行
复制
*r = o

其中r是输出迭代器。

根据Coliru显示的错误消息,似乎库正在检查std::is_copy_assignable<element>,这当然是假的。

这似乎是一个错误;移动应该使用移动赋值操作符。

在相同的Coliru中比较以下内容:

代码语言:javascript
运行
复制
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) );。因此,如果我的第一行有效,那么我的第二行也应该有效。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24643844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档