带有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 成员。

不确定,但我认为kUnboudLowerkUnboundUpper 是下限和上限的特殊未绑定值;他们是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成员变量?的主要内容,如果未能解决你的问题,请参考以下文章

iOS getter setter

为啥这个 constexpr 静态成员函数在调用时不被视为 constexpr?

C ++:私有结构的每个单个成员的通用getter/setter

一个类不能有自己的静态 constexpr 成员实例吗?

GroovyGroovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )

成员变量/方法/ getter和setter是否可以包含在一个公共访问修饰符中?