以下是有效的C++代码,为什么不呢?
std::array<std::string, 42> a1;
std::array<int, a1.size()> a2;
它不能在GCC 4.8中编译(在C++ 11模式下).有一个简单但不优雅的解决方法:
std::array<std::string, 42> a1;
std::array<int, sizeof(a1)/sizeof(a1[0])> a2;
很明显,编译器可以计算出std :: array中的元素数量.为什么std :: array :: size()不是constexpr static函数?
编辑:我找到了另一种解决方法:
std::array<std::string, 42> a1;
std::array<int, std::tuple_size<decltype(a1)>::value> a2;
Ada*_*son 16
array<T>::size()是constexpr,但你不能以这种方式使用它,因为a1它不是一个constexpr值.另外,它不能是constexpr因为string不是文字类型.
但是,如果需要,可以通过推导size_t模板参数来解决此问题.例:
#include <string>
#include <array>
#include <iostream>
using namespace std;
template<typename>
struct array_size;
template<typename T, size_t N>
struct array_size<array<T,N> > {
    static size_t const size = N;
};
array<string, 42> a1;
array<string, array_size<decltype(a1)>::size> a2;
int main() {
    cout << a2.size() << endl;
}
chr*_*ris 10
std::array::size实际上要求符合constexprC++ 11标准的§23.3.2.1:
23.3.2.4 array::size [array.size]  
template <class T, size_t N> constexpr size_type array<T,N>::size() noexcept;  
Returns: N
我猜这只是在GCC中实施它的人.
经过测试,这有效:
std::array<int, 42> a1;
std::array<int, a1.size()> a2;
这可能实际上与std::string不是constexpr制作编译时实例的有效类型有关,而是int.
| 归档时间: | 
 | 
| 查看次数: | 8123 次 | 
| 最近记录: |