带有setter的constexpr成员变量?
Posted
技术标签:
【中文标题】带有setter的constexpr成员变量?【英文标题】:Constexpr member variables with setters? 【发布时间】:2018-04-21 00:13:06 【问题描述】:所以在我的 C++ 家庭作业中,指令说..
为 kUnboundLower 和 kUnboundUpper 创建一个 constexpr 成员。
...
创建下限和上限设置器和获取器。
这怎么可能?如果某事是constexpr
,则不能再次设置。我在这里错过了什么?
【问题讨论】:
我认为你的作业有误。类中的 constexpr 仅适用于构造函数和成员函数,不适用于成员 【参考方案1】:如果某些东西是 constexpr,则不能再次设置它。我错过了什么 在这里?
您可以在 constexpr 上下文中修改对象,但前提是修改为 constexpr。
例如:
constexpr auto foo() -> int return 24;
struct X
int x_;
constexpr auto x() -> int& return x_;
;
constexpr auto make_x(int a)
X x;
x.x() = a; // invalid if `x()` is not `constexpr`
return x;
auto test()
constexpr auto x = make_x(24);
请想象一个更实用的例子,这很有用,我的大脑现在太累了,想出一个实际的例子,但是有,例如当你不能从构造函数创建对象,但需要创建后单独设置成员。
【讨论】:
一个更实际的例子:++it
of a (const) range 的(自定义)迭代器。【参考方案2】:
这怎么可能?如果某些东西是 constexpr 你不能再次设置它。我在这里错过了什么?
不确定,但在我看来你误解了你的任务。
创建一个接受:[下限,上限)的 ctor。
你的类定义了一个范围,有一个下限和一个上限;您必须创建一个构造函数来接收下限的值和上限的值。
创建一个不受上限和下限约束的默认 ctor。
默认构造函数是不接收参数的构造函数。如果我理解正确,默认构造函数必须为未绑定值对应的上限和下限设置特殊值
为 kUnboundLower 和 kUnboundUpper 创建一个 constexpr 成员。
不确定,但我认为kUnboudLower
和kUnboundUpper
是下限和上限的特殊未绑定值;他们是constexpr
,所以他们是static
。
举个例子,比如
#include <limits> // for std::numeric_limits
class range
private:
static constexpr int kUnboundLower std::numeric_limits<int>::min() ;
static constexpr int kUnboundUpper std::numeric_limits<int>::max() ;
int lBound;
int uBound;
public:
// default constructor
range () : lBoundkUnboundLower, uBoundkUnboundUpper
// constructor with values
range (int l, int u) : lBoundl, uBoundu
// ......
;
【讨论】:
以上是关于带有setter的constexpr成员变量?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 constexpr 静态成员函数在调用时不被视为 constexpr?
C ++:私有结构的每个单个成员的通用getter/setter
GroovyGroovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )