constexpr std::array 与 static_assert

2023-11-22

#include <iostream>
#include <array>

int main(int argc, char **argv) {
    constexpr const std::array<int, 2> arr {{ 0, 1 }};
    constexpr const int arr2[] = { 0, 1};

    static_assert(arr[0] == arr2[0], "asdf");
    static_assert(arr[1] == arr2[1], "asdfasdf");

    return 0;
}

当编译时gcc 4.8.2 and 4.9.1 using g++ test.cpp --std=c++11,编译成功。 当编译时clang 3.4 and 3.5 using clang++ test.cpp --std=c++11但是,编译失败:

test.cpp:8:16: error: static_assert expression is not an integral constant expression
        static_assert(arr[0] == arr2[0], "asdf");
                      ^~~~~~~~~~~~~~~~~
test.cpp:8:16: note: non-constexpr function 'operator[]' cannot be used in a constant expression

所以我的问题是,从符合 C++11 的意义上来说,哪个编译器是“正确的”?而如果clang是正确的,那么为什么 std::array 的operator[]没有 constexpr 能力吗?这难道不是其中之一吗?std::array应该可以帮助解决吗?


看起来像clang是正确的,操作员 []不是 C++11 中的 constexpr,而是 C++14 中的 constexpr

constexpr const_reference operator[]( size_type pos ) const; (since C++14)

所以编译-std=c++14应该可以工作(现场观看).

In the C++11标准草案部分23.3.2.1 类模板数组概述有以下内容operator []:

reference operator[](size_type n);
const_reference operator[](size_type n) const;

C++14 标准草案有以下内容:

reference operator[](size_type n);
constexpr const_reference operator[](size_type n) const;
^^^^^^^^^

Update

标准草案N3485它是在 C++11 之后发布的,包含对 C++11 的增强修复。它包含一个常量表达式的版本operator []。如果这是缺陷报告的一部分那么gcc是正确的,考虑到这似乎是合理的clang 3.6.0也接受C++11模式的程序。

Update 2

我找到了介绍更改的文档,N3470由于我找不到有关此特定问题的任何缺陷报告,因此这似乎是一个增强功能,因此不应成为 C++11 的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

constexpr std::array 与 static_assert 的相关文章

随机推荐