#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
和4.9.1
使用g++ test.cpp --std=c++11
编译,编译成功。 当clang 3.4
和3.5
使用clang++ test.cpp --std=c++11
然而编译,编译失败:constexpr的std ::阵列static_assert
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
应该帮助解决的事情之一吗?
在C++ 11中,将'array :: operator [] const'声明为'constexpr'已成为可能,但委员会在C++ 14之前没有考虑这么做。在C++ 14中,将'array :: operator []'声明为'constexpr'成为可能...... – Casey 2014-11-04 18:12:54
@Casey我找到了将变更引入'N3485'的文档,我将其添加到我的答案中。据我了解,如果它被认为是一个缺陷,它应该允许在C + + 11模式,但否则不应该。尽管如此,该文件并没有阐明。 – 2014-11-04 18:14:43
我大部分时间都喜欢这个标准:库变化通常落后于核心,因为核心喜欢在最后一刻进行更改,而没有给库提供足够的时间来做出反应。我相信在N3470中增加constexpr是一个增强,因为涉及'constexpr'的'array'的唯一缺陷报告是[LWG DR 720](http://www.open-std.org/jtc1/sc22 /wg21/docs/lwg-defects.html#720),它不涉及'operator []'。 – Casey 2014-11-04 18:27:42