我不清楚返回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; }
答案 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
右值引用,这是移动构造函数作为其参数。