关于操作符重载定义中的const
about the const in an operator overloading definition
对于
的定义const vector3F operator*(const vector3F &v, float s);
有两个const
,它们各自的用法是什么?
参数中的const-reference意味着您不更改v
,因此您可以将常量向量(和临时向量!)传递给函数。这是件好事。
按值返回常量是一种噱头。它阻止你写这样的东西:
vector3F v = get_vector();
vector3F w = v;
(v * 1.5) = w; // outch! Cannot assign to constant, though, so we're good.
作为常量返回值是有问题的,因为它干扰了c++ 11的右值引用和移动语义:
move_me(v * 1.5); // cannot bind to `vector3F &&` :-(
由于这个原因,并且因为像我上面展示的那样的滥用是不太可能偶然发生的,所以可能最好只按值返回非常量
第一个const表示返回值是常量,不能更改(顺便说一下,这对于乘法操作符来说不是一个好主意):
const Vector3F v = myvector*100.0;
v.x = 0; // error: the vector is constant and can not be altered
第二个const表示实参"v"是常量:
const vector3F operator*(const vector3F &v, float s)
{
v.x = 0; // error: "v" is constant
}
相关文章:
- 在运算符重载定义中使用成员函数(const错误)
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何定义在编译时数据未知的 const 数组
- 具体来说,标准在哪里规定修改 const 对象是未定义的行为?
- 注意:"Entity_c::Entity_c(const Entity_c&)"被隐式删除,因为默认定义格式不正确:
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何键入用于const对象的自定义io操纵器
- 正在通过const-ref未定义的行为捕获新构造的对象
- 自定义链表const_iterator无法遍历列表的非const实例
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 如何检查函数是否真的获得了定义为 const 的变量?
- STL按客户"<"运算符对向量进行排序。为什么要将"<"运算符定义为 const?
- 为什么相同的函数签名只有区别,另一个通过 const 获取参数是重新定义?
- 明确定义'static const variable in a struct'对C++ 11 及以上有什么影响吗?
- C++ CMake 构建错误:未定义对"boost::throw_exception(std::exception const&)"的引用
- 如果我返回const定义的对象,为什么const关键字被取消资格
- 混合constexpr声明和const定义
- 只读内存映射寄存器在C中使用' volatile const '定义,但在c++中仅使用' volatile '