编译时对 std::array 的引用大小不可用

Jac*_*son 7 c++ arrays static-assert stdarray

我很想知道为什么static_assert下面代码中的第二个不起作用。似乎即使数组c是对 的引用a,数组的大小也嵌入在类型中,因此它应该在编译时可用。

#include <array>

int main()
{
    std::array<int,2> a = {1,2};
    std::array<int,2> b = {2,3};
    std::array<int,2>& c = a;

    static_assert(a.size() == b.size(), "a.size==b.size"); // ok size of array is compile time constant
    static_assert(c.size() == a.size(), "c.size==a.size"); // compiler error "static_assert expression is not an integral constant expression"
}
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 8

数组的大小嵌入在类型中,因此它应该在编译时可用。

这是真的。但无论如何,c不是常量表达式,因此包含它作为子表达式的表达式不能是常量表达式 - 除了某些仅与操作数的类型交互的运算符,例如sizeof.

例如,您可以使用以下方法获取尺寸:

static_assert(
    std::tuple_size<
        std::remove_reference_t<decltype(c)>
    >::value == a.size(),
    "c.size==a.size"
);
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不是很漂亮。