编译似乎错误的代码(关于对象返回)

时间:2014-06-13 14:39:38

标签: c++ return-value-optimization

最近有人问我一个关于构造函数返回值的问题。经过几次讨论后,我发现有些事情似乎不对。以下是样本:

#include <conio.h>
#include <stdio.h>
#include <iostream>

/*
struct A // Won't be compiled
{
    A(void) {};
    A(const A &) {};
    A(A &&) = delete;
};
*/

struct A // Compiled but...
{
    A(void) {};
    A(const A &) = delete;
    A(A &&) {};
};

A func(void)
{
    A temp;

    return temp;// 'temp' is a named object, so it should be a lvalue and the A(const A &) should have been invoked.
    //return std::move(temp); // OK.
}

int main(void)
{
    func();

    _getch();
    return(0);
}

它将被编译(通过VC或通过gcc编译)......但它看起来不对。

问题是:即使是任何复制推断条件也已被触发,似乎没有理由让'A(const A&amp;)&#39;被忽视,不是吗?

1 个答案:

答案 0 :(得分:4)

12.8 [class.copy]

  

32 - 当满足或将满足复制操作的省略标准时,除了源对象是函数参数,并且要复制的对象由左值指定,重载决策以选择首先执行复制的构造函数,就好像对象是由rvalue指定的一样。 [...]

NRVO允许复制省略,因此temp被视为右值。