首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“<temporary>”的修改不是常量表达式

“<temporary>”的修改不是常量表达式
EN

Stack Overflow用户
提问于 2020-11-24 22:43:06
回答 1查看 194关注 0票数 3

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

代码语言:javascript
复制
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有关--比如

代码语言:javascript
复制
std::initializer_list<std::pair<int, int> > 

百事大吉。代码如下:

代码语言:javascript
复制
#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设为空会使代码可编译。例如:

代码语言:javascript
复制
static constexpr std::initializer_list<std::pair<int, std::initializer_list<int> > > s={{0, {}}, {1, {}}, {2, {}}};
EN

回答 1

Stack Overflow用户

发布于 2020-11-25 01:16:15

这个问题的解决方案是让在另一个std::initializer_list中使用的每个常量对象都成为一个常量变量。因此,将编译以下代码:

代码语言:javascript
复制
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}
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64988808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档