我從這里了解到,這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;
}
這是一個復制鏈接: https ://godbolt.org/z/zjrP1Kvn7
uj5u.com熱心網友回復:
您必須將引數放入模板引數中。不幸的是,它不能再推斷出引數的型別:
#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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/486487.html
下一篇:在Golang模板中將物件歸零
