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

Should I use const return type in a simple access member function?

本文关键字:const 返回类型 函数 简单 访问 成员 我应该      更新时间:2023-10-16

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

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;

这取决于你想做什么。如果希望客户端代码能够从类外部修改私有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关键字与您的原始问题无关。

我认为从函数中返回const double没有意义,

如果

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

在其他情况下,返回类型应简单地定义为双精度。

按值返回时,通常最好不要返回 const。 原因是:只要你的消费者不改变你的状态,你真的不在乎它用它做什么。此外,(不包括 const 强制转换)客户端始终可以通过复制绑定到非 const - 但为什么要强制它这样做?

最好定义 const 访问函数(如果可以的话),因为它允许具有 const 引用的类的用户访问该值(而无需复制 const 引用)。

对于上面的函数,形式为:

inline const double x();

在返回非指针或引用类型时没有多大意义。通常,在返回指针或引用时保留 const 修饰符。

正如我在评论中所说,对于内置类型,我认为这并不重要。请参阅在 C++11 中返回 const 值类型对移动语义的影响,了解原因:

调用按值返回的函数的表达式是 prvalue。 但是,没有非类非数组类型的常量值 (§5/6):

如果 prvalue 最初具有类型"cv T",其中 T 是 CV-非限定非类、非数组类型、表达式的类型 在进行任何进一步分析之前调整为 T。

这意味着您的两个定义之间没有区别 函数。无论它返回一个 const int 还是只返回一个 int 是 无关紧要,因为表达式从来都不是常量。