gpt4 book ai didi

c++11 - 无法运行 move 构造函数

转载 作者:行者123 更新时间:2023-12-04 05:08:49 25 4
gpt4 key购买 nike

C++11

我在使用 move 构造函数时遇到问题。我有一个简单的容器类,名为 Number ,其唯一的数据成员是整数。我有以下代码:

//Number.h
#ifndef NUMBER_H
#define NUMBER_H
#include <iostream>

class Number
{
public:
Number();
Number(int ipar);
Number(const Number& src);
Number(Number&& src);
private:
int num;
};

#endif


//Number.cpp
#include "Number.h"

Number::Number()
{
std::cout << "default ctor" << std::endl;
}

Number::Number(int ipar) : num(ipar)
{
std::cout << "integer argument ctor" << std::endl;
}

Number::Number(const Number& src) : num(src.num)
{
std::cout << "copy ctor" << std::endl;
}

Number::Number(Number&& src) : num(src.num)
{
std::cout << "move ctor" << std::endl;
}


//main.cpp
#include "Number.h"
using namespace std;

int main()
{
cout << "Part A:" << endl;
Number n1(1);
cout << "Part B:" << endl;
Number n2(n1);
cout << "Part C:" << endl;
Number n3{Number{n1}};
cout << "Part D:" << endl;
Number n4(Number(n1));
return 0;
}

这输出:
Part A:
integer argument ctor
Part B:
copy ctor
Part C:
copy ctor
Part D:

注意 D 部分没有输出。 A 部分和 B 部分的输出符合我的预期,但其他部分的输出不是。

我希望这适用于 C 和 D 部分:
Part C:
copy ctor
move ctor
Part D:
copy ctor
move ctor

对 C 部分的期望:

我期待 Number{n1} Number n3{Number{n1}} 的一部分暂时无名 Number对象,因为 Number 之间没有名称和左花括号,通过使用 n1 调用复制构造函数.然后我期待 Number n3通过使用临时对象调用 move 构造函数来构造。

对 D 部分的期望:

由于这类似于 Part C,除了括号而不是花括号,我希望这部分的行为和输出与我期望的 C 部分相同。

问题:

为什么实际输出与我的期望不同,获得所需输出的正确方法是什么?

注:如果你想在 Visual Studio 中编译它,你需要 Visual C++ Compiler November 2012 CTP或更高版本的 Visual Studio 2012 以支持统一的初始化语法。

最佳答案

n4 is a function declaration . n3是由 copy elision 引起的.

检查 here我已启用 -fno-elide-constructors以避免复制省略。 n3然后显示一系列复制和 move 构造函数。

有一条注释掉的行试图使用 n4作为一个对象。如果取消注释它,您将看到编译器错误,告诉它是一个函数。

对于 n4不要被解释为函数声明,您可以在临时变量周围加上额外的括号以防止它被视为函数参数:Number n4((Number(n1))) .有了这个和 -fno-elide-constructors你所期望的一切都会发生。

请注意 -fno-elide-constructors在 MSVC 中不作为选项出现。

关于c++11 - 无法运行 move 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15151765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com