我应该在简单的访问成员函数中使用const返回类型吗?

时间:2014-02-12 21:07:06

标签: c++ move-semantics

我仍然不太确定“移动语义”。在一个简单的点类中,

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;

5 个答案:

答案 0 :(得分:2)

我觉得从函数

返回const double没有意义

如果需要在编译时使用其结果,可以将函数定义为constexpr

在其他情况下,返回类型应定义为double。

答案 1 :(得分:2)

这取决于你想做什么。如果您希望客户端代码能够从类外部修改私有xval_,则需要返回double&;但是,你可能不想这样做。

您还有两个选择是返回doubleconst 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   无关紧要,因为表达式永远不会是常量。