繁体   English   中英

constexpr std :: array with static_assert

[英]constexpr std::array with static_assert

#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.24.9.1使用g++ test.cpp --std=c++11编译时,编译成功。 使用clang++ test.cpp --std=c++11编译clang 3.43.5时,编译失败:

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是正确的, operator []不是C ++ 11中的constexpr,而是C ++中的constexpr 14

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

所以使用-std=c++14编译应该可以工作( 请参见实时 )。

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;
^^^^^^^^^

更新

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

更新2

我找到了引入这些更改的文档, N3470 ,因为我找不到关于这个特定问题的任何缺陷报告,所以这似乎是一个增强,因此不应该是C ++ 11的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM