为什么这不是constexpr?

DrP*_*zza 6 c++ unions constexpr c++11

#include <iostream>

union gc_bits {
    size_t value;
    struct {
        size_t arena : 2;
    } bits;

    constexpr gc_bits(size_t value_) : value(value_) {
    }
};

static constexpr size_t get_max_arenas() {
    return gc_bits(~0ULL).bits.arena;
}

size_t current_colour[get_max_arenas()]; // error

int main() {
    std::cout << get_max_arenas() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

数组声明错误,因为get_max_arenas不是constexpr.我不清楚为什么会这样.

Tem*_*Rex 7

稍微改写一下你的程序:

static constexpr auto gma = get_max_arenas();

size_t current_colour[gma]; // error
Run Code Online (Sandbox Code Playgroud)

给出了Clang错误:

在常量表达式中不允许读取具有活动成员'value'的联合成员'bits'

你得到这个错误的原因是构造函数设置了value,然后你尝试阅读bits.正如@gurka所评论的那样,这是不允许的.

标准报价:

[expr.const]

2所述的条件表达式e是一个核心常量表达式除非 e的评价,如下所述抽象机(1.9),将评估下面的表达式中的一个的规则:

(2.8) -左值到右值被施加到该指glvalue转换(4.1)或修饰(5.18,5.2.6,5.3.2)联合的非活动构件或它们的子对象;