调用按值返回的函数的表达式是纯右值。但是,没有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右值引用,移动构造函数将其作为参数。