【发布时间】:2014-06-13 14:39:37
【问题描述】:
最近有人问我一个关于构造函数返回值的问题。经过几次讨论后,我发现似乎有些不对劲。这是示例:
#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 &)'被忽略,不是吗?
【问题讨论】:
-
A(A &&)构造函数在这种情况下是可以的。为什么你认为不是? -
我刚刚编辑了帖子。 'temp' 是一个左值,所以我认为应该调用 'A(const A &)'。
-
但是它正在被返回,所以你可以把它看作是调用方的右值。
标签: c++ return-value-optimization