返回结构体时,NRVO是否保证作用于成员构造?成员移动构造有保障吗?
问题解答
1. 成员x的移动构造有没有标准保证?
没有。你当前代码里return FooResult {.x = x};中的x是函数内的局部左值,C++标准不会自动把它当成右值来触发移动构造,默认会调用MoveConstructibleType的拷贝构造函数。
要是想确保触发移动构造,得显式把x转成右值:
return FooResult {.x = std::move(x)};
这时候只要MoveConstructibleType有合法的移动构造函数,就一定会被调用,这是标准明确保证的。
2. NRVO会作用于成员的构造过程吗?
不会。NRVO(命名返回值优化)管的是整个FooResult对象的构造位置:它允许编译器直接在调用方的内存里构造返回的FooResult,避免对整个对象做拷贝或移动。但NRVO不会改成员x的初始化逻辑——不管NRVO有没有生效,FooResult::x是拷贝还是移动初始化,完全由你写的代码决定,NRVO碰不到这一步。
举个例子:就算编译器用了NRVO把FooResult直接建在调用方,FooResult::x还是会按照你写的= x来做拷贝构造,除非你改成= std::move(x)才会触发移动。
内容的提问来源于stack exchange,提问作者dav
相关产品推荐
相关产品推荐

