C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 具有static_assert的constexpr std ::数组大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#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;
}

当使用g test.cpp –std = c 11编译gcc 4.8.2和4.9.1时,编译成功.
然而,当使用clang 3.4和3.5编译时,使用clang test.cpp –std = c 11,编译失败:@H_674_6@

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

所以我的问题是,哪个编译器在符合C11的意义上是“正确的”?而且,如果clang是正确的,那么为什么std :: array的operator []不是constexpr能力?这不是std :: array应该帮助解决的一件事吗?@H_674_6@

解决方法

看起来cl声是正确的,operator []不是C11中的constexpr,而是C14中的constexpr
constexpr const_reference operator[]( size_type pos ) const; (since C++14)

所以用-std = c 14编译应该可以(see it live).@H_674_6@

C++11 draft standard部分23.3.2.1类模板阵列概述对于operator []有以下内容:@H_674_6@

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

C++14 draft standard则具有以下特点:@H_674_6@

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

更新@H_674_6@

C 11之后的标准N3485草案包含修复对C 11的增强.它包含一个constexpr版本的operator [].如果这是缺陷报告的一部分,那么gcc将是正确的,这似乎是合理的虑到cl ang 3.6.0也接受程序在C 11模式.@H_674_6@

更新2@H_674_6@

我发现引入变化的文档,N3470,因为我没有找到关于这个具体问题的缺陷报告,那么这似乎是一个增强,因此不应该是C11的一部分.@H_674_6@

大佬总结

以上是大佬教程为你收集整理的c – 具有static_assert的constexpr std ::数组全部内容,希望文章能够帮你解决c – 具有static_assert的constexpr std ::数组所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。