Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/cplusplus11/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ constexpr std::带有静态断言的数组_C++_C++11_Constexpr_Static Assert_Stdarray - Fatal编程技术网

C++ constexpr std::带有静态断言的数组

C++ constexpr std::带有静态断言的数组,c++,c++11,constexpr,static-assert,stdarray,C++,C++11,Constexpr,Static Assert,Stdarray,所以我的问题是,哪一个编译器在遵从C++11的意义上是“正确的”?而且,如果clang是正确的,那么为什么std::array的操作符[]不支持constexpr?这不是std::array应该帮助解决的问题之一吗?看起来clang是正确的,它不是C++11中的constexpr,而是C++14中的constexpr test.cpp:8:16: error: static_assert expression is not an integral constant expression

所以我的问题是,哪一个编译器在遵从C++11的意义上是“正确的”?而且,如果
clang
是正确的,那么为什么std::array的
操作符[]
不支持constexpr?这不是
std::array
应该帮助解决的问题之一吗?

看起来
clang
是正确的,它不是C++11中的constexpr,而是C++14中的constexpr

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
因此,使用
-std=c++14
进行编译应该是可行的()

在章节
23.3.2.1
类模板数组概述中,对
运算符[]
有以下内容:

constexpr const_reference operator[]( size_type pos ) const; (since C++14)
而该公司有以下几点:

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

在C++11之后出现的标准草案包含了对C++11的改进。它包含一个constexpr版本的
操作符[]
。如果这是缺陷报告的一部分,那么
gcc
是正确的,考虑到
clang3.6.0
也接受C++11模式下的程序,这似乎是合理的

更新2


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

在C++11中,可以将
array::operator[]const
声明为
constepr
,但是直到C++14,委员会才开始这样做。在C++14中,可以将
array::operator[]
声明为
constepr
。@Casey我找到了将更改引入
N3485
的文档,并将其添加到了我的答案中。据我所知,如果它被认为是一个缺陷,它应该在C++11模式下被允许,否则就不允许。不过,文档并没有对此做出澄清。我主要是在取笑标准:库的更改往往落后于核心,因为核心喜欢在最后一刻做出更改,而没有给库足够的时间做出反应。我相信N3470中添加的
constexpr
是一种增强,因为
array
中涉及
constexpr
的唯一缺陷报告是,它不涉及
operator[]
。使用--std=c++1y 3.5和--std=c++14在clang3.4中编译似乎确实像我所期望的那样工作。
reference operator[](size_type n);
const_reference operator[](size_type n) const;
reference operator[](size_type n);
constexpr const_reference operator[](size_type n) const;
^^^^^^^^^