c++ - 将 set 函数(setter)标记为 constexpr 的目的是什么?
问题描述
我无法理解将 setter 函数标记为 的目的constexpr
,这是自 C++14 以来允许的。我的误解来自下一种情况:我声明了一个带有 constexpr c-tor 的类,并且我将通过创建该类的 constexpr 实例在 constexpr 上下文中使用它constexpr Point p1
。一个对象p1
现在是常量,它的值不能改变,所以constexpr
不能调用 setter。另一方面,当我class Point
在非 constexpr 上下文中创建 my 的实例时Point p
,我可以调用该对象的 setter,但现在 setter 不会在编译时执行,因为该对象不是 constexpr!
结果,我不明白如何使用constexpr
setter 来提高代码的性能。
这是演示在非 constexpr 对象上调用 constexpr setter 的代码,这意味着运行时计算,而不是编译时:
class Point {
public:
constexpr Point(int a, int b)
: x(a), y(b) {}
constexpr int getX() const noexcept { return x; }
constexpr int getY() const noexcept { return y; }
constexpr void setX(int newX) noexcept { x = newX; }
constexpr void setY(int newY) noexcept { y = newY; }
private:
int x;
int y;
};
int main() {
Point p{4, 2};
constexpr Point p1{4, 2};
p.setX(2);
}
谁能帮我理解将 setter 函数标记为的目的是constexpr
什么?
解决方案
基本上,当您必须处理 constexpr 函数时,这很好。
struct Object {
constexpr void set(int n);
int m_n = 0;
};
constexpr Object function() {
Object a;
a.set(5);
return a;
}
constexpr Object a = function();
这个想法是能够在编译时执行的另一个函数中执行编译时初始化。它不适合应用于constexpr
对象。
另一件要知道的事情是,constexpr
成员函数不是const
C++14 以来的成员函数 :)。
推荐阅读
- sql - 不熟悉的 SQL UPDATE 语句用于运行整体解决方案
- apache-spark - 合并两个不同的 pyspark 数据框
- php - 如何在try命令中执行多个语句
- r - 是否有任何统计上合理的方法可以将网络中的中心性分数转换为费率?
- java - 在 Android 上使用 drawable 加载形状
- c# - OpenCV灰度忽略红色
- makefile - 无法使 makefile 工作
- c++ - 为什么 `void* = 0` 和 `void* = nullptr` 会有所不同?
- angular - 使用占位符和 ngModel 动态生成输入元素
- primeng - PrimeNG
全局过滤器不工作在角度