首先,简单例子不使用GCC12编译:
#include <array>
#include <iostream>
#include <initializer_list>
template <int nvars> class Test1 {
public:
Test1( std::initializer_list<int> IL ) : arr { 0 }
{
// See https://stackoverflow.com/questions/38932089/can-i-initialize-an-array-using-the-stdinitializer-list-instead-of-brace-enclo
};
const std::array<int,nvars> arr;
};
// CTAD guide / simple-template-id
Test1(std::initializer_list<int> IL) -> Test1<IL.size()>;
int main() {
Test1 test1({1,2,3,4});
std::cout << "nvars: " << test1.arr.size() << std::endl;
}这里的simple-template_id是Test1<IL.size()>,其中IL.size()是一个返回4的constexpr函数,它确实使用硬编码的4进行编译,但这显然不符合目的。
什么是和不允许在simple-template_id的CTAD指南?什么名字,什么类型的表达式?
发布于 2022-11-14 14:45:01
问题是像IL这样的参数不是constexpr。这意味着我们不能使用IL.size()作为模板参数,因为模板参数必须是编译时间常数。
因此,要解决这个问题,我们必须传递一个编译时间常数作为模板参数。这样做的一种方法是将参数作为对大小为N的数组的引用,其中包含T类型的元素,其中T和N都是模板参数。
template<typename T, std::size_t N> Test1(T const(&&)[N]) -> Test1<N>;https://stackoverflow.com/questions/74433344
复制相似问题