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