为什么要在构造函数上使用constexpr?

用户名

我知道这constexpr将使您能够在编译时将对象用作常量,但是什么时候会有益呢?我试图更好地理解该关键字,但找不到在解释为什么需要该关键字的构造方法上使用该关键字时的最佳示例。

下面的两个示例都起作用,那么为什么将constexpr放在构造函数上呢?

在构造函数上使用constexpr:

#include <iostream>
using namespace std;

class Rect
{
    public:
        constexpr Rect(int width, int height)
            : mWidth(width), mHeight(height) {}
        constexpr int getArea() const { return mWidth * mHeight; }
    private:
        int mWidth, mHeight;
};

int main(int argc, char* argv[])
{
    constexpr Rect r(8, 2);

    cout << r.getArea() << endl;   //16

    int myArray[r.getArea()];    // OK


    return 0;
}

在构造函数上不使用constexpr:

#include <iostream>
using namespace std;

class Rect
{
    public:
        Rect(int width, int height)
            : mWidth(width), mHeight(height) {}
        constexpr int getArea() const { return mWidth * mHeight; }
    private:
        int mWidth, mHeight;
};

int main(int argc, char* argv[])
{
    Rect r(8, 2);

    cout << r.getArea() << endl;   //16

    int myArray[r.getArea()];    // OK


    return 0;
}
毫米

在第二个示例中,int myArray[r.getArea()];由于r.getArea()不是常数表达式,因此在Standard C ++中是不允许的。(如果您的编译器接受它,那么您就依赖于编译器扩展,并且如果您以一致模式调用编译器,则应该产生警告)。

如果将数组更改为:

std::array<int, r.getArea()> myArray;

对于非constexpr版本,编译器不太可能接受

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么要在构造函数中使用对const的引用?

来自分类Dev

为什么要在stdio函数上使用SDL I / O函数?

来自分类Dev

constexpr构造函数上是否允许使用return语句?

来自分类Dev

为什么要在自动加载器函数上使用自动加载器类?

来自分类Dev

为什么模板允许constexpr函数成员与非constexpr构造函数一起使用?

来自分类Dev

为什么要在构造函数中定义事件处理程序成员函数(内联)以便使用“ unbind”?

来自分类Dev

为什么需要在构造函数中绑定函数

来自分类Dev

为什么构造函数需要在类的后面精确命名?

来自分类Dev

为什么需要在构造函数中调用超类?

来自分类Dev

为什么要在构造函数中实例化变量,以及为什么要使用属性来访问变量

来自分类Dev

为什么constexpr不适用于构造函数?

来自分类Dev

为什么要在函数中使用参数?

来自分类Dev

为什么此闭包也需要在外部函数上返回?

来自分类Dev

为什么在JavaScript函数上使用jQuery插件?

来自分类Dev

GCC和Clang在constexpr构造函数上的不同行为

来自分类Dev

为什么构造函数上的显式说明符不能阻止向上转换?

来自分类Dev

为什么模板替换在构造函数上失败,除非添加括号?

来自分类Dev

为什么我需要在map :: emplace中对不可复制对象的单个arg构造函数使用piecewise_construct?

来自分类Dev

为什么要使用move构造函数?

来自分类Dev

为什么要使用 list() 构造函数?

来自分类Dev

为什么要在函数体内使用函数声明

来自分类Dev

为什么在函数上没有括号

来自分类Dev

对象构造函数上的“ this”

来自分类Dev

为什么要在void上使用int函数?

来自分类Dev

为什么要在JavaScript中使用函数作用域?

来自分类Dev

为什么要在C中使用函数声明?

来自分类Dev

为什么要在python中使用`iter`函数

来自分类Dev

为什么要在void上使用int函数?

来自分类Dev

为什么我们需要在MSIL中显式调用父构造函数?

Related 相关文章

  1. 1

    为什么要在构造函数中使用对const的引用?

  2. 2

    为什么要在stdio函数上使用SDL I / O函数?

  3. 3

    constexpr构造函数上是否允许使用return语句?

  4. 4

    为什么要在自动加载器函数上使用自动加载器类?

  5. 5

    为什么模板允许constexpr函数成员与非constexpr构造函数一起使用?

  6. 6

    为什么要在构造函数中定义事件处理程序成员函数(内联)以便使用“ unbind”?

  7. 7

    为什么需要在构造函数中绑定函数

  8. 8

    为什么构造函数需要在类的后面精确命名?

  9. 9

    为什么需要在构造函数中调用超类?

  10. 10

    为什么要在构造函数中实例化变量,以及为什么要使用属性来访问变量

  11. 11

    为什么constexpr不适用于构造函数?

  12. 12

    为什么要在函数中使用参数?

  13. 13

    为什么此闭包也需要在外部函数上返回?

  14. 14

    为什么在JavaScript函数上使用jQuery插件?

  15. 15

    GCC和Clang在constexpr构造函数上的不同行为

  16. 16

    为什么构造函数上的显式说明符不能阻止向上转换?

  17. 17

    为什么模板替换在构造函数上失败,除非添加括号?

  18. 18

    为什么我需要在map :: emplace中对不可复制对象的单个arg构造函数使用piecewise_construct?

  19. 19

    为什么要使用move构造函数?

  20. 20

    为什么要使用 list() 构造函数?

  21. 21

    为什么要在函数体内使用函数声明

  22. 22

    为什么在函数上没有括号

  23. 23

    对象构造函数上的“ this”

  24. 24

    为什么要在void上使用int函数?

  25. 25

    为什么要在JavaScript中使用函数作用域?

  26. 26

    为什么要在C中使用函数声明?

  27. 27

    为什么要在python中使用`iter`函数

  28. 28

    为什么要在void上使用int函数?

  29. 29

    为什么我们需要在MSIL中显式调用父构造函数?

热门标签

归档