常量返回类型在 NRVO 案例中的相关性
Relevance of const return type in NRVO cases
这是在返回语句中调用构造函数的后续问题。
这是一个操作员在课堂上超载的乐趣。
const Integer operator+(const Integer& IntObject)
{
cout << "Data : " << this->data << endl;
return Integer(this->data + IntObject.data);
}
在返回类型中,const 与此类函数的相关性是什么?
int main()
{
Integer A(1); //Create 2 object of class Integer
Integer B(2);
const Integer C = A + B; //This will work
Integer D = A + B; //This will also work
fun(A + B); //Will work
}
void fun(Integer F) {}
在这种情况下,由于 NRVO,在返回步骤中不会创建临时工。要返回的对象直接构造在被调用方的地址上。
下面是一个更好的示例:
struct Foo
{
void gizmo();
Foo const operator+(Foo const & rhs);
};
现在如果你有一个Foo x; Foo y;
,那么你不能说:
(x + y).gizmo(); // error!
常量返回值意味着不能将其用于非常量操作。对于基元类型,这不是那么相关,因为您可以在临时对象上执行的非常量操作并不多,因为不允许在临时对象上执行许多"有趣的"操作(如前缀 - ++
)。
也就是说,对于 C++11,人们应该真正尝试采用永不返回常量值的新习语,因为非常量值现在可以进行优化。
有些人曾经建议这样做,以防止像A + B = C
那样写废话。但是,在 C++11 中,它可以阻止某些优化,因为它会使返回值不可移动。因此,你不应该这样做。
在这种情况下,它还会阻止您编写完全有效的代码,例如 D = A + B + C
,但这只是因为作者忘记声明运算符 const
.
代码片段中没有相关性,因为您正在创建返回值的副本。
通常,很难找到返回const
值的充分理由。我只能看到它在这种类型的表达式中起作用,试图在临时const
上调用非常量方法:
(someObject.someMethodReturningConstValue()).someNonConstMethod(); // error, calls non const method on const temporary
因此,仅当您想要禁止在临时上调用非 CONST 方法时,才应使用它。另一方面,它在 C++11 中扼杀了移动语义,因此不鼓励。
相关文章:
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 为什么这个案例陈述需要一个"if else"而不仅仅是一个"if"?
- 来自colPivHouseholderQr().solve的拟合相关性
- C++ switch 语句:对案例进行分组,并针对每个案例给出特定的说明
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- Python & C-C++ 扩展模块案例段故障
- 与 SDL2(以及类似案例)一起构建SDL2_image
- 自定义分配器,包括放置新案例
- 案例内部的功能
- 正在读取开关案例中的.txt文件
- 获取处理器相关性(linux)时出现问题
- 弄清楚这段代码是怎么回事(递归下降案例研究)
- 在线程退出之前,线程分配的内存块是否与线程本身具有相同的相关性?
- C++实用程序,用于将长开关语句转换为封装开关案例阶梯的简洁函数调用
- 在早期的 C 和 C++ 编译器中,手动位移位与乘法和除法的相关性如何?
- 在任何案例之前,在 switch 语句中的使用声明是否合法?
- 案例标签值已出现错误
- 案例语句不会前进到下一个语句
- C++的研究案例.抽象类和实例
- 常量返回类型在 NRVO 案例中的相关性