M. *_*ley 3 c++ const move-semantics c++11
我不清楚返回const值对C++ 11中移动语义的影响.
这两个返回数据成员的函数有什么区别吗?const在C++ 11中仍然是多余的?
int GetValueA() { return mValueA; }
const int GetValueB() { return mValueB; }
Run Code Online (Sandbox Code Playgroud)
这些功能怎么样?
int GetValuesAB() { return mValueA + mValueB; }
const int GetValuesCD() { return mValueC + mValueD; }
Run Code Online (Sandbox Code Playgroud)
调用按值返回的函数的表达式是prvalue.但是,没有const非类非数组类型的prvalues(§5/ 6):
如果prvalue最初具有类型"cv
T",其中T是cv非限定的非类非数组类型,则T在进行任何进一步分析之前调整表达式的类型.
这意味着您的两个函数定义之间没有区别.它是返回a const int还是只是一个int无关紧要,因为表达式永远不会const.
但是,当您返回类类型时会有所不同.请考虑以下示例:
struct foo
{
void bar() { std::cout << "Hello" << std::endl; }
};
foo get_foo();
Run Code Online (Sandbox Code Playgroud)
现在,如果我们打电话get_foo(),我们会得到一个临时foo对象.这个prvalue不是const,我们可以const在其上调用非成员函数,所以我们可以愉快地做get_foo().bar().但是,我们可以get_foo像这样更改声明:
const foo get_foo();
Run Code Online (Sandbox Code Playgroud)
现在,表达式get_foo()是一个constprvalue(由于它是一个类类型而被允许),我们不能再调用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
Run Code Online (Sandbox Code Playgroud)
这是因为constprvalue不会绑定到非const右值引用,这是移动构造函数作为其参数.
| 归档时间: |
|
| 查看次数: |
917 次 |
| 最近记录: |