<i id='ft9dB'><tr id='ft9dB'><dt id='ft9dB'><q id='ft9dB'><span id='ft9dB'><b id='ft9dB'><form id='ft9dB'><ins id='ft9dB'></ins><ul id='ft9dB'></ul><sub id='ft9dB'></sub></form><legend id='ft9dB'></legend><bdo id='ft9dB'><pre id='ft9dB'><center id='ft9dB'></center></pre></bdo></b><th id='ft9dB'></th></span></q></dt></tr></i><div id='ft9dB'><tfoot id='ft9dB'></tfoot><dl id='ft9dB'><fieldset id='ft9dB'></fieldset></dl></div>
      1. <small id='ft9dB'></small><noframes id='ft9dB'>

        <tfoot id='ft9dB'></tfoot>
        <legend id='ft9dB'><style id='ft9dB'><dir id='ft9dB'><q id='ft9dB'></q></dir></style></legend>

          <bdo id='ft9dB'></bdo><ul id='ft9dB'></ul>

        RVO 是否适用于对象成员?

        Does RVO work on object members?(RVO 是否适用于对象成员?)
          <bdo id='BaFNd'></bdo><ul id='BaFNd'></ul>
            1. <i id='BaFNd'><tr id='BaFNd'><dt id='BaFNd'><q id='BaFNd'><span id='BaFNd'><b id='BaFNd'><form id='BaFNd'><ins id='BaFNd'></ins><ul id='BaFNd'></ul><sub id='BaFNd'></sub></form><legend id='BaFNd'></legend><bdo id='BaFNd'><pre id='BaFNd'><center id='BaFNd'></center></pre></bdo></b><th id='BaFNd'></th></span></q></dt></tr></i><div id='BaFNd'><tfoot id='BaFNd'></tfoot><dl id='BaFNd'><fieldset id='BaFNd'></fieldset></dl></div>
              <tfoot id='BaFNd'></tfoot>

                <tbody id='BaFNd'></tbody>
            2. <legend id='BaFNd'><style id='BaFNd'><dir id='BaFNd'><q id='BaFNd'></q></dir></style></legend>

              <small id='BaFNd'></small><noframes id='BaFNd'>

                  本文介绍了RVO 是否适用于对象成员?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  考虑以下事项:

                  struct A { /* ... */ };
                  
                  A foo() {
                    auto p = std::make_pair(A{}, 2);
                    // ... do something
                    return p.first;
                  }
                  
                  auto a = foo();
                  

                  p.first 会被复制、移动或 RVO 编辑吗?

                  Will p.first be copied, moved or RVO-ed?

                  推荐答案

                  我发现在 Visual Studio 2010 和 gcc-5.1 RVO 中应用(参见例如 http://coliru.stacked-crooked.com/a/17666dd9e532da76).

                  I've found in Visual Studio 2010 and in gcc-5.1 RVO is not applied (see for example http://coliru.stacked-crooked.com/a/17666dd9e532da76).

                  标准的相关部分是12.8.31.1 [class.copy].它指出允许复制省略(我的突出显示):

                  The relevant section of the standard is 12.8.31.1 [class.copy]. It states that copy elision is permitted (my highlighting):

                  在具有类返回类型的函数中的return语句中,当表达式为非易失性自动对象的名称(除了函数参数或异常引入的变量-声明一个与函数返回类型具有相同类型(忽略cv限定)的处理程序([except.handle])),可以通过将自动对象直接构造到函数的返回值中来省略复制/移动操作

                  in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object (other than a function parameter or a variable introduced by the exception-declaration of a handler ([except.handle])) with the same type (ignoring cv-qualification) as the function return type, the copy/move operation can be omitted by constructing the automatic object directly into the function's return value

                  由于 p.first 不是对象的名称,因此禁止 RVO.

                  Since p.first is not the name of an object, RVO is prohibited.

                  这篇关于RVO 是否适用于对象成员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  How to print vector#39;s data(如何打印矢量的数据)
                  Visual C++ appends 0xCC (int3) bytes at the end of functions(Visual C++ 在函数末尾附加 0xCC (int3) 字节)
                  How to use a variable inside a _T wrapper?(如何在 _T 包装器中使用变量?)
                  MSVC++ warning flags(MSVC++ 警告标志)
                  How to read file which contains uxxxx in vc++(如何在vc++中读取包含uxxxx的文件)
                  stack overflow error in C++ program(C++程序中的堆栈溢出错误)
                  <i id='Tlq6x'><tr id='Tlq6x'><dt id='Tlq6x'><q id='Tlq6x'><span id='Tlq6x'><b id='Tlq6x'><form id='Tlq6x'><ins id='Tlq6x'></ins><ul id='Tlq6x'></ul><sub id='Tlq6x'></sub></form><legend id='Tlq6x'></legend><bdo id='Tlq6x'><pre id='Tlq6x'><center id='Tlq6x'></center></pre></bdo></b><th id='Tlq6x'></th></span></q></dt></tr></i><div id='Tlq6x'><tfoot id='Tlq6x'></tfoot><dl id='Tlq6x'><fieldset id='Tlq6x'></fieldset></dl></div>
                    <bdo id='Tlq6x'></bdo><ul id='Tlq6x'></ul>
                          <tbody id='Tlq6x'></tbody>
                          <tfoot id='Tlq6x'></tfoot>

                          1. <small id='Tlq6x'></small><noframes id='Tlq6x'>

                            <legend id='Tlq6x'><style id='Tlq6x'><dir id='Tlq6x'><q id='Tlq6x'></q></dir></style></legend>