我应该在简单的访问成员函数中使用 const 返回类型吗?
Should I use const return type in a simple access member function?
我仍然不太确定"移动语义"。在一个简单的点类中,
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&
;但是,您可能不想这样做。
您的另外两个选择是返回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
关键字与您的原始问题无关。
我认为从函数中返回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 是 无关紧要,因为表达式从来都不是常量。
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 将返回类型专用化为 void 或 const 左值引用
- 用 decltype 和 auto 推导出 const(返回)类型
- 为什么当返回类型为 const 时可以修改返回值
- 作为返回类型"const int&"做什么?
- const 在具有尾随返回类型的自动退货声明中是什么意思
- 我应该在简单的访问成员函数中使用 const 返回类型吗?
- T const & 在函数的返回类型中是什么意思?
- 字符串的decltype和const引用返回类型
- 德尔福中C++“const”返回类型相当于什么
- g++编译器忽略const返回类型
- const*char类型中的返回值在获得值时立即被取消引用
- 当返回类型为静态const时,如果返回非静态局部会发生什么?
- 使用c++11 auto作为const函数对象的返回类型
- 函数声明返回类型中的Const关键字
- int* const* foo(int x);是一个有效的 C 函数原型。您如何"read"此返回类型?