在C ++ 11中返回const值类型对移动语义的影响

时间:2013-04-01 14:31:16

标签: c++ c++11 const move-semantics

我不清楚返回const值对C ++ 11中移动语义的影响。

这两个返回数据成员的函数有什么区别吗? C ++ 11中const仍然是多余的吗?

int GetValueA() { return mValueA; }
const int GetValueB() { return mValueB; }

这些功能怎么样?

int GetValuesAB() { return mValueA + mValueB; }
const int GetValuesCD() { return mValueC + mValueD; }

1 个答案:

答案 0 :(得分:5)

调用按值返回的函数的表达式是prvalue。但是,没有非类非数组类型的const prvalues(§5/ 6):

  

如果prvalue最初的类型为“cv T”,其中T是cv非限定的非类非数组类型,则表达式的类型将调整为{{1在进行任何进一步分析之前。

这意味着您对函数的两个定义没有区别。它是返回T还是只返回const int是无关紧要的,因为表达式永远不会int

但是,当您返回类类型时会有所不同。请考虑以下示例:

const

现在,如果我们调用struct foo { void bar() { std::cout << "Hello" << std::endl; } }; foo get_foo(); ,我们会得到一个临时的get_foo()对象。此prvalue不是foo,我们可以在其上调用非const成员函数,因此我们很乐意const。但是,我们可以更改get_foo().bar()的声明:

get_foo

现在,表达式const foo get_foo(); get_foo() prvalue(由于它是类类型而被允许),我们不能再对它返回的临时对象调用const

尽管如此,谈论非类型的移动语义是没有意义的,因为bar永远不会被移除。如果您返回int类类型,则该类型也不能移动,因为它是const。为了证明:

const

这是因为foo get_foo(); foo f(get_foo()); // Will call the move constructor const foo get_foo(); foo f(get_foo()); // Will call the copy constructor prvalue不会绑定到非const右值引用,这是移动构造函数作为其参数。