如何解决在 gcc 9.3 中编译但不在 gcc 10.2 中编译的 C++ 代码
以下代码可以在 gcc 9.3 中编译,但不能在 gcc 10.2 中编译:
constexpr std::array<int,2> opt = {1,2};
template <typename T>
constexpr auto f(const T& arr)
{
std::array<int,arr.size()> res{};
return res;
}
int main()
{
auto res = f(opt);
}
代码在 https://godbolt.org/z/8hb6M8 中。
gcc10.2 给出的错误是 arr.size() is not a constant expression
。
哪个编译器是对的? 9.3 还是 10.2?
如果 10.2 是正确的,我如何定义编译时数组并将其大小(和数组)作为参数传递?
解决方法
不确定哪个是正确的,但对于
如何定义编译时数组并将其大小(和数组)作为参数传递?
您可以将功能更改为
template <typename T,std::size_t N>
constexpr auto f(const std::array<T,N>& arr)
{
std::array<int,N> res{};
return res;
}
现在大小被提升到模板参数中。
,另一种在两种编译器中都适用且不需要更改模板声明的替代方法:
init
,
从 C++20 开始,常量表达式的定义发生了变化,您可以在 this 上找到一些变化。
更简短的答案是更改您的函数签名:
template <typename T>
constexpr auto f(const T& arr);
进入:
template <typename T>
constexpr auto f(const T arr);
然后它works。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。