C++ constexpr std::带有静态断言的数组
所以我的问题是,哪一个编译器在遵从C++11的意义上是“正确的”?而且,如果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
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;
^^^^^^^^^