当值是非常量但使用常量表达式初始化时使用 constexpr?

Posted

技术标签:

【中文标题】当值是非常量但使用常量表达式初始化时使用 constexpr?【英文标题】:Using constexpr when a value is non-const but initialized with a constant expression? 【发布时间】:2018-10-30 14:36:02 【问题描述】:

由于某种原因,我很难掌握如何正确使用constexpr

标题中描述的情况是否适合使用它?即:

void foo()

    static constexpr const size_t MAX_BUFFER_SIZE = 20 * 1024 * 1024;

    constexpr size_t bufferSize = 1024 * 1024; // Initialized with constant expression
    std::vector<char> buffer(bufferSize, ' ');

    //...

    if (some_condition())
    
        bufferSize = get_random_value_at_runtime(); // Assigned a new 'non-constexpr' value
        buffer.resize(bufferSize, ' ');
    

    //...   

亲切的问候!

【问题讨论】:

【参考方案1】:

标题中描述的情况是否适合使用它?

错了。

constexpr size_t bufferSize = 1024 * 1024; // Initialized with constant expression

// ...

    bufferSize = get_random_value_at_runtime(); 

constexpr 暗示(也是)const

您不能重新分配 const 变量。

【讨论】:

有趣,阅读来自Difference between constexpr and const 的答案让我觉得它们完全相互独立。 @notanalien 在您的链接答案中,它有 我什么时候可以/应该同时使用 const 和 constexpr? A. 在对象声明中。当两个关键字都引用要声明的同一个对象时,这从来没有必要。 constexpr 暗示 const。 和 max66 说的一样。 @notanalien - 当它们用于结构/类的方法(成员函数)时,它们可以是独立的,但仅从 C++14 开始;在 C++11 中,constexpr 方法也是 const。无论如何,constexpr 变量是曾经(也是 C++14 和 C++17)也是 const

以上是关于当值是非常量但使用常量表达式初始化时使用 constexpr?的主要内容,如果未能解决你的问题,请参考以下文章

如何将工作断点设置为常量表达式?

#私藏项目实操分享# Go 语言入门很简单 -- 4. 常量

Salesforce基础 - Apex常量

C语言数组寻址

C++ const int 在常量表达式中不可用

C++_const 常量成员以及成员初始化列表及其常量类