从 lambda 分配 return 值会导致复制吗?
Does assigning return value from a lambda cause a copy?
我以前使用过这种模式来进行模块特定的初始化,例如在 .cpp 文件的顶部:
static bool isInitialized = []()
{
...//do stuff
return true;
}();
但是像这样的东西呢:
static MyObject something = []()
{
MyObject ret(...);
ret.x(...)
return ret;
}();
是否确定 something
将 成为 ret
,或者将成为副本?我想避免复制。
我主要使用 VS2017/C++14,但很快就会转向 C++17。
第一种情况不应是 C++17 中的副本。您正在 returning 一个纯右值,因此不会创建临时值,而是直接构造 isInitialized
。在 C++14 中,这只是一个可选的优化。
第二种情况是使用命名变量,因此您必须依赖 NRVO 来进行优化,这在任何版本的 C++ 中都无法保证。在“加号”方面,函数局部参数在 return 语句中被视为右值,因此 ret
可以移动,如果不能则仅复制。
我以前使用过这种模式来进行模块特定的初始化,例如在 .cpp 文件的顶部:
static bool isInitialized = []()
{
...//do stuff
return true;
}();
但是像这样的东西呢:
static MyObject something = []()
{
MyObject ret(...);
ret.x(...)
return ret;
}();
是否确定 something
将 成为 ret
,或者将成为副本?我想避免复制。
我主要使用 VS2017/C++14,但很快就会转向 C++17。
第一种情况不应是 C++17 中的副本。您正在 returning 一个纯右值,因此不会创建临时值,而是直接构造 isInitialized
。在 C++14 中,这只是一个可选的优化。
第二种情况是使用命名变量,因此您必须依赖 NRVO 来进行优化,这在任何版本的 C++ 中都无法保证。在“加号”方面,函数局部参数在 return 语句中被视为右值,因此 ret
可以移动,如果不能则仅复制。