- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题源于钻研std::move
在 return
语句,例如在以下示例中:
struct A
{
A() { std::cout << "Constructed " << this << std::endl; }
A(A&&) noexcept { std::cout << "Moved " << this << std::endl; }
};
A nrvo()
{
A local;
return local;
}
A no_nrvo()
{
A local;
return std::move(local);
}
int main()
{
A a1(nrvo());
A a2(no_nrvo());
}
打印 (MSVC,/std:c++17, release)
Constructed 0000000C0BD4F990
Constructed 0000000C0BD4F991
Moved 0000000C0BD4F992
我对返回按值的函数中的 return 语句的一般初始化规则感兴趣,以及在使用
std::move
返回局部变量时适用哪些规则。如上图所示。
- Evaluates the expression, terminates the current function and returns the result of the expression to the caller after implicit conversion to the function return type. [...]
- when returning from a function that returns by valuelike so
return other;
回到我的例子,根据我目前的知识 - 与上述规则相反 -
A a1(nrvo());
是声明
直接初始化 a1 与纯右值
nrvo()
.那么究竟哪个对象是
复制初始化 如 cppreference.com 中所描述的返回语句?
std::move
案例
std::move(local)
有类型
A&&
但是
no_nrvo()
声明返回类型
A
,所以这里
returns the result of the expression to the caller after implicit conversion to the function return type
A glvalue of any non-function, non-array type T can be implicitly converted to a prvalue of the same type. [...] For a class type, this conversion [...] converts the glvalue to a prvalue whose result object is copy-initialized by the glvalue.
A&&
至
A
A
的移动构造函数 使用,这也是此处禁用 NRVO 的原因。这些规则是否适用于这种情况,我是否正确理解它们?此外,他们再次说
复制初始化 由泛左值但
A a2(no_nrvo());
是直接初始化。所以这也涉及到第一种情况。
最佳答案
在深入了解这些细节时,您必须小心使用 cppreference.com,因为它不是权威来源。
So which object exactly is copy-initialized as described at cppreference.com for return statements?
To convert from A&& to A A's move constructor is used, which is also why NRVO is disabled here. Are those the rules that apply in this case, and did I understand them correctly?
return std::move(local);
,不是
local
返回的是
A&&
这是调用
std::move()
的结果.这没有名称,因此强制性 NRVO 不适用。
I think this should be an Lvalue to rvalue conversion:
A&&
返回者
std::move()
绝对不是左值。它是一个 xvalue,因此已经是一个右值。这里没有发生左值到右值的转换。
but A a2(no_nrvo()); is a direct initialization. So this also touches on the first case.
return
的一部分语句不受该函数调用方式的任何影响。同样,函数的返回参数在调用点的使用方式不受函数定义的影响。
an
由函数的结果直接初始化。实际上,这意味着编译器将为
an
使用相同的内存位置。对象作为函数的返回值。
A a1(nrvo());
,感谢 NRVO,分配给
local
的内存位置与函数的结果值相同,恰好是
a1
已经。有效,
local
和
a1
一直都是同一个对象。
A a2(no_nrvo())
,
local
有自己的存储,以及函数的结果,又名
a2
是从它移动构造的。有效,
local
搬进
a2
.
关于c++ - 按值返回的函数的 return 语句中的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68883573/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!