相关疑难解决方法(0)

默认移动构造函数和引用成员

从N3337的[12.8] [11]:

非联合类X的隐式定义的复制/移动构造函数执行其基础和成员的成员复制/移动.[注意:忽略非静态数据成员的大括号或大小写.另请参见12.6.2中的示例.-end note]初始化顺序与用户定义构造函数中基数和成员的初始化顺序相同(见12.6.2).让我们x为构造函数的任何参数,或者对于移动构造函数,x值指的是参数.以适合其类型的方式复制/移动每个基本或非静态数据成员:

- 如果成员是一个数组,则使用x的相应子对象直接初始化每个元素;

- 如果成员m具有右值引用类型T &&,则直接初始化为static_cast<T&&>(x.m);

- 否则,用x的相应基数或成员直接初始化基数或成员.

这实际上是一个澄清,但我看不到在该子句中提到左值引用成员.由于它没有提到它们,默认情况下似乎说它们是隐式成员移动的一部分,但是以下方法不起作用;

int x = 5;
int& y = x;
int& z(std::move(y)); //error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'std::remove_reference<int&>::type {aka int}'
Run Code Online (Sandbox Code Playgroud)

因此,可以安全地假设默认的移动构造函数区分成员是一个引用而且只是这样做

int& z = y;
Run Code Online (Sandbox Code Playgroud)

没有电话std::move

c++ constructor reference move c++11

10
推荐指数
1
解决办法
2222
查看次数

rvalue数据成员初始化:聚合初始化与构造函数

对于以下代码:

#include <iostream>
#include <memory>
#include <string>
using namespace std;

struct Foo {
    string tag;

    Foo(string t): tag(t){
        cout << "Foo:" << tag << endl;
    }
    ~Foo() {
        cout << "~Foo:" << tag << endl;
    }
};

struct Bar {
    Foo&& foo;
};

struct Baz{
    Foo&& foo;
    Baz(Foo&& f):foo(std::move(f)){

    }
};

int main() {
    Bar bar{Foo("Bar")};
    Baz baz{Foo("Baz")};
    cin.get();
}
Run Code Online (Sandbox Code Playgroud)

结果(g ++ 7.1.0):

Foo:Bar
Foo:Baz
~Foo:Baz
Run Code Online (Sandbox Code Playgroud)

我们可以看到bar成功延长了临时Foo的生命周期但baz未能成功延长.两者有什么区别?如何Baz正确实现构造函数?

编辑:实际上VC++ 2017给出:

Foo:Bar
~Foo:Bar
Foo:Baz
~Foo:Baz
Run Code Online (Sandbox Code Playgroud)

所以我猜整件事情都不可靠.

c++ c++11

7
推荐指数
1
解决办法
633
查看次数

标签 统计

c++ ×2

c++11 ×2

constructor ×1

move ×1

reference ×1