为什么这里不执行 NRVO多次返回?

问题描述

在以下方法中不为 MyString ret 执行 NRVO。认构造的 MyString (return {};) 直接构造到目标中,ret 被移动构造到目标中。

MyString MyString::Substring(size_type idx,size_type length)
{
    size_type thisSize{ getSize() };
    if (thisSize - idx < length)
    {
        return {};
    }
    
    MyString ret{ length + 1 };
    for (size_type otherIdx{ 0 }; otherIdx < length; ++otherIdx)
    {
        ret[otherIdx] = (*this)[idx + otherIdx];
    }
    ret[length] = '\0';
    return ret;
}

如果 MyString ret{length + 1}; 位于 if 语句的上方,其主体中有 return{};,我很清楚为什么它不能直接构建到目标中:如果是,并且之后,认构造的 MyString 对象被返回,需要销毁 ret,并且认构造的对象将取代它。这是不可取的。但是,在这种情况下,MyString ret 不能直接构造到目标中的根本原因是什么?在代码中构造时,众所周知该函数不会return {};

我确定我在这里忽略了一些东西。非常感谢任何帮助!

编辑:这是@rustyx 建议的最小可重现示例:

#include <iostream>

class Foo
{
public:
    Foo() = default;

    Foo(Foo&&) { std::cout << "Moved" << std::endl; }
};

Foo func(int i)
{
    if (i < 0)
    {
        return {};
    }
    Foo bar;
    return bar;
}
int main()
{
    Foo test{ func(-1) };
    Foo test1{ func(1) };
}

打印:

(nothing)
Moved

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...