3

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

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

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

这些功能呢?

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

1 回答 1

6

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

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

这意味着您对函数的两个定义之间没有区别。它返回 aconst int还是只返回 anint无关紧要,因为表达式 never const

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

struct foo
{
  void bar() { std::cout << "Hello" << std::endl; }
};

foo get_foo();

现在,如果我们调用get_foo(),我们会得到一个临时foo对象。这个prvalue不是const,我们可以在它上面调用非const成员函数,所以我们可以很高兴地这样做get_foo().bar()get_foo但是,我们可以像这样更改声明:

const foo get_foo();

现在,表达式get_foo()是一个const纯右值(这是允许的,因为它是一个类类型),我们不能再调用bar它返回的临时对象。

尽管如此,谈论非类类型的移动语义是没有意义的,因为 anint永远不会被移动。如果你返回一个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

这是因为const纯右值不会绑定到非const右值引用,移动构造函数将其作为参数。

于 2013-04-01T14:46:49.343 回答