从非 constexpr 参数创建一个 constexpr 数组
Creating a constexpr array from non-constexpr argument
我从 here 那里了解到 args
不是 常量表达式 。现在 我的问题是 :我应该在给定的程序中修改什么,以便我能够在第一个变体中有一个 static_assert 而不会出现编译时错误。
在下面的代码中:
#include <array>
template<typename... Args>
auto constexpr CreateArrConst(Args&&... args)
{
std::array arr
{
args...
};
//i want to have an static_assert here without error
return arr;
}
template<typename... Args>
auto constexpr CreateArrConst_NotWorking(Args&&... args)
{
constexpr std::array arr
{
args...
};
static_assert(arr.back() == 4);
return arr;
}
int main()
{
static_assert(CreateArrConst(4).back() == 4);
// uncomment this to reproduce compile error
// static_assert(CreateArrConst_NotWorking(4).back() == 4);
return 0;
}
这里有一个 link 可以重现:
https://godbolt.org/z/zjrP1Kvn7
您必须将参数放入模板参数中。不幸的是,它无法再推断出参数的类型:
#include <array>
template<typename T, T... args>
auto constexpr CreateArrConst()
{
constexpr std::array arr
{
args...
};
static_assert(arr.back() == 4);
return arr;
}
// cleaner solution requiring C++17
template<auto... args>
auto constexpr CreateArrConstCpp17()
{
constexpr std::array arr
{
args...
};
static_assert(arr.back() == 4);
return arr;
}
int main()
{
static_assert(CreateArrConst<int, 4>().back() == 4); // <-- Works!
static_assert(CreateArrConstCpp17<1, 2, 3, 4>().back() == 4);
return 0;
}
我从 here 那里了解到 args
不是 常量表达式 。现在 我的问题是 :我应该在给定的程序中修改什么,以便我能够在第一个变体中有一个 static_assert 而不会出现编译时错误。
在下面的代码中:
#include <array>
template<typename... Args>
auto constexpr CreateArrConst(Args&&... args)
{
std::array arr
{
args...
};
//i want to have an static_assert here without error
return arr;
}
template<typename... Args>
auto constexpr CreateArrConst_NotWorking(Args&&... args)
{
constexpr std::array arr
{
args...
};
static_assert(arr.back() == 4);
return arr;
}
int main()
{
static_assert(CreateArrConst(4).back() == 4);
// uncomment this to reproduce compile error
// static_assert(CreateArrConst_NotWorking(4).back() == 4);
return 0;
}
这里有一个 link 可以重现: https://godbolt.org/z/zjrP1Kvn7
您必须将参数放入模板参数中。不幸的是,它无法再推断出参数的类型:
#include <array>
template<typename T, T... args>
auto constexpr CreateArrConst()
{
constexpr std::array arr
{
args...
};
static_assert(arr.back() == 4);
return arr;
}
// cleaner solution requiring C++17
template<auto... args>
auto constexpr CreateArrConstCpp17()
{
constexpr std::array arr
{
args...
};
static_assert(arr.back() == 4);
return arr;
}
int main()
{
static_assert(CreateArrConst<int, 4>().back() == 4); // <-- Works!
static_assert(CreateArrConstCpp17<1, 2, 3, 4>().back() == 4);
return 0;
}