gpt4 book ai didi

c++ - ‘’ 的修饰不是常量表达式

转载 作者:行者123 更新时间:2023-12-04 17:23:08 28 4
gpt4 key购买 nike

此代码用于使用早期的 g++ 版本进行编译,例如5.3.使用 10.2 我得到以下结果(使用编译器选项 -std=c++11)

tmp1.cpp: In function ΓÇÿint main(int, char**)ΓÇÖ:
tmp1.cpp:17:117: error: modification of ΓÇÿ<temporary>ΓÇÖ is not a constant expression
17 | static constexpr std::initializer_list<std::pair<int, std::initializer_list<int> > > s={{0, {1}}, {1, {2}}, {2, {3}}};
| ^
tmp1.cpp:18:33: error: non-constant condition for static assertion
18 | static_assert(isSortedPairVector(s.begin(), s.end()), "sorted");
| ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~

我认为这与包含另一个 initializer_list 的 initializer_list 有一些关系——就像

std::initializer_list<std::pair<int, int> > 

一切都很好。这是代码:

#include <initializer_list>
#include <utility>
#include <iostream>


template<typename T>
constexpr bool isSortedPairVector(const T&_p, const T&_pEnd)
{ return _p == _pEnd || _p + 1 == _pEnd
? true
: _p->first < (_p + 1)->first
&& isSortedPairVector(_p + 1, _pEnd);
}


int main(int, char**)
{
static constexpr std::initializer_list<std::pair<int, std::initializer_list<int> > > s={{0, {1}}, {1, {2}}, {2, {3}}};
static_assert(isSortedPairVector(s.begin(), s.end()), "sorted");
}

奇怪的是——将包含的 initializer_list 设为空使得代码可编译。例如

static constexpr std::initializer_list<std::pair<int, std::initializer_list<int> > > s={{0, {}}, {1, {}}, {2, {}}};

最佳答案

此问题的解决方案是使在另一个 std::initializer_list 中使用的每个 std::initializer_list 对象成为一个 constexpr 变量。因此编译如下:

static constexpr std::initializer_list<int> s1({1, 2});
static constexpr std::initializer_list<
std::pair<int, std::initializer_list<int> >
> s={
{0, s1},
{1, s1},
{2, s1}
};

关于c++ - ‘<temporary>’ 的修饰不是常量表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64988808/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com