我仍然不太确定“移动语义”。在一个简单的点类中,
class point
{
private:
double xval_, yval_, zval_;
public:
// Constructs
// ...
public:
// Access (return xval_)
inline const double x() const;
// Edit
inline double& x();
};
我应该在我的Access功能中使用inline const double x() const;
还是inline double x() const;
?
答案 0 :(得分:2)
我觉得从函数
返回const double
没有意义
如果需要在编译时使用其结果,可以将函数定义为constexpr
。
在其他情况下,返回类型应定义为double。
答案 1 :(得分:2)
这取决于你想做什么。如果您希望客户端代码能够从类外部修改私有xval_,则需要返回double&
;但是,你可能不想这样做。
您还有两个选择是返回double
或const double
。在这种情况下,它们都是一样的;在这种情况下,添加const
不会带来任何好处,因此您只需返回double
,因为const
是多余的。
double x() const;
如果您有指针或引用,那么您可能需要考虑根据您要执行的操作为返回类型指定const
。例如:
const double* xPtr() const;
double* const xPtr() const;
const double* const xPtr() const;
注意我没有在任何地方指定inline
。这是你在原帖中没有提出的单独讨论。对于此示例,您可以采用任何一种方式 - 包含它或省略它 - inline
关键字与您的原始问题无关。
答案 2 :(得分:1)
按值返回时,通常最好不要返回const。原因是:只要您的消费者不改变您的状态,您就不会关心它的用途。 此外,(不包括const cast)客户端总是可以通过复制绑定到非const - 但是为什么要强制它执行此操作呢?
答案 3 :(得分:1)
定义const访问函数(如果你能够)是很好的,因为它允许具有const引用的类的用户访问该值(无需复制const引用)。
对于上述功能,表格为:
inline const double x();
返回非指针或引用类型时,没有多大意义。通常,在返回指针或引用时保留const修饰符。
答案 4 :(得分:1)
正如我在评论中所说,对于内置类型,我认为不重要。有关原因,请参阅Impact of returning const value types in C++11 on move semantics:
调用按值返回的函数的表达式是prvalue。 但是,没有非类非数组类型的const prvalues (§5/ 6):
如果prvalue最初具有“cv T”类型,其中T是a cv-unqualified non-class,non-array type,表达式的类型 在进行任何进一步分析之前,将其调整为T.
这意味着你的两个定义之间没有区别 功能。它是返回一个const int还是只返回一个int 无关紧要,因为表达式永远不会是常量。