Hol*_*olt 16 c++ arrays constexpr c++11
以下代码:
std::array<int, 4> arr1;
std::array<float, arr1.size()> arr2;
Run Code Online (Sandbox Code Playgroud)
...编译两者gcc并clang因为std::array::size被考虑constexpr.
但是以下gcc版本没有编译(版本5.3.0 20151204):
std::array<std::vector<int>, 4> arr1;
std::array<std::vector<double>, arr1.size()> arr2;
Run Code Online (Sandbox Code Playgroud)
对我来说,没有理由这样的代码如果第一个有效则无法编译,但由于我没有找到很多帖子,我不知道它是一个gccbug还是一个clang扩展?
错误来自gcc(我真的不明白......):
main.cpp: In function 'int main()':
main.cpp:6:46: error: call to non-constexpr function 'constexpr std::array<_Tp, _Nm>::size_type std::array<_Tp, _Nm>::size() const [with _Tp = std::vector<int>; long unsigned int _Nm = 4ul; std::array<_Tp, _Nm>::size_type = long unsigned int]'
std::array<std::vector<double>, arr1.size()> arr2;
^
In file included from main.cpp:1:0:
/usr/local/include/c++/5.3.0/array:170:7: note: 'constexpr std::array<_Tp, _Nm>::size_type std::array<_Tp, _Nm>::size() const [with _Tp = std::vector<int>; long unsigned int _Nm = 4ul; std::array<_Tp, _Nm>::size_type = long unsigned int]' is not usable as a constexpr function because:
size() const noexcept { return _Nm; }
^
/usr/local/include/c++/5.3.0/array:170:7: error: enclosing class of constexpr non-static member function 'constexpr std::array<_Tp, _Nm>::size_type std::array<_Tp, _Nm>::size() const [with _Tp = std::vector<int>; long unsigned int _Nm = 4ul; std::array<_Tp, _Nm>::size_type = long unsigned int]' is not a literal type
/usr/local/include/c++/5.3.0/array:89:12: note: 'std::array<std::vector<int>, 4ul>' is not literal because:
struct array
^
/usr/local/include/c++/5.3.0/array:89:12: note: 'std::array<std::vector<int>, 4ul>' has a non-trivial destructor
main.cpp:6:46: error: call to non-constexpr function 'constexpr std::array<_Tp, _Nm>::size_type std::array<_Tp, _Nm>::size() const [with _Tp = std::vector<int>; long unsigned int _Nm = 4ul; std::array<_Tp, _Nm>::size_type = long unsigned int]'
std::array<std::vector<double>, arr1.size()> arr2;
^
main.cpp:6:48: note: in template argument for type 'long unsigned int'
std::array<std::vector<double>, arr1.size()> arr2;
^
Run Code Online (Sandbox Code Playgroud)
Bar*_*rry 21
我认为这与CWG问题1684有关.以前,constexpr要求包括:
的类的一个
constexpr功能是一个成员应是文字型
而且std::array<std::vector<int>, 4>是不是一个字面类型,因此它的size()成员函数不会constexpr.但是,新的措辞允许constexpr非文字类型的非静态成员函数,假设这些函数满足所有其他要求constexpr(array<T,N>::size()显然这样做).
根据新的措辞,这是一个gcc错误.之前提交的是66297.
| 归档时间: |
|
| 查看次数: |
1429 次 |
| 最近记录: |