[英]modification of ‘<temporary>’ is not a constant expression
此代码用于使用较早的 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}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.