最近有人问我一个关于构造函数返回值的问题。经过几次讨论后,我发现有些事情似乎不对。以下是样本:
#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;被忽视,不是吗?
答案 0 :(得分:4)
12.8 [class.copy] :
32 - 当满足或将满足复制操作的省略标准时,除了源对象是函数参数,并且要复制的对象由左值指定,重载决策以选择首先执行复制的构造函数,就好像对象是由rvalue指定的一样。 [...]
NRVO允许复制省略,因此temp
被视为右值。