当前位置: 首页 > 知识库问答 >
问题:

尽管嵌套结构与全局结构相同,但它会破坏constexpr

朱阳晖
2023-03-14

我在使用以下代码时遇到问题:

template<typename T>
constexpr int get(T vec) {
  return vec.get();
}

struct coord {
  constexpr int get() const { return x; }
  int x;
};

struct foo {
    struct coord2 {
      constexpr int get() const { return x; }
      int x;
    };
    constexpr static coord f = { 5 };
    constexpr static int g = get(f); // works

    constexpr static coord2 h = { 5 };
    constexpr static int i = get(h); // doesn't work
};

constexpr coord foo::f;
constexpr foo::coord2 foo::h;

int main(){}

本质上,get(f) 被认为是一个常量表达式,但 get(h) 不是。唯一更改的是,一个使用全局结构坐标,而另一个使用嵌套结构坐标2。结构体是相同的。

为什么会这样?

GCC误差:

test.cpp:20:35: error: field initializer is not constant

叮当错误:

test.cpp:20:26: error: constexpr variable 'i' must be initialized by a constant expression
    constexpr static int i = get(h); // doesn't work
                         ^   ~~~~~~
test.cpp:8:10: note: undefined function 'get' cannot be used in a constant expression
  return vec.get();
         ^
test.cpp:20:30: note: in call to 'get({5})'
    constexpr static int i = get(h); // doesn't work
                             ^
test.cpp:13:21: note: declared here
      constexpr int get() const { return x; }

共有1个答案

胡墨竹
2023-03-14

这是一个不变的表达。最终,如图所示,您可以通过将 i 移动到 main() 中看到:

    < Li > http://ideone . com/Luc fui

错误消息非常清楚发生了什么,这就是<code>foo::coord2::get()</code>尚未定义,因为成员函数定义被延迟到封闭类结束,以便它们可以使用稍后声明的成员。

定义延迟到最外层封闭类的末尾有点令人惊讶,但如果foo::coord2::get()无法访问foo::g,则会更加惊讶。

本标准与编译器一致,但第9.2p2节的部分内容如下

在类成员规范中,该类在函数体、默认参数、异常规范以及非静态数据成员的大括号或相等的初始值设定项(包括嵌套类中的此类内容)中被视为完整的。

不幸的是,只能推断类声明的右括号成为这些延迟区域的定义点。我认为这是标准中的一个缺陷,它没有明确说明这一点。

另请参见:

    < Li > https://stack overflow . com/a/11523155/103167
 类似资料:
  • 本文向大家介绍C++ 嵌套类/结构,包括了C++ 嵌套类/结构的使用技巧和注意事项,需要的朋友参考一下 示例 甲class或struct还可以包含另一个class/struct内部本身的定义,这被称为“嵌套类”; 在这种情况下,包含类称为“封闭类”。嵌套类定义被认为是封闭类的成员,但在其他方面则是单独的。 从封闭类的外部,可以使用范围运算符访问嵌套类。但是,在封闭类的内部,可以使用没有限定符的嵌套

  • 4. 嵌套结构体 结构体也是一种递归定义:结构体的成员具有某种数据类型,而结构体本身也是一种数据类型。换句话说,结构体的成员可以是另一个结构体,即结构体可以嵌套定义。例如我们在复数的基础上定义复平面上的线段: struct segment { struct complex_struct start; struct complex_struct end; }; 从第 1 节 “复合类型与结构体”

  • 问题内容: 我不知道如何初始化嵌套结构。在此处找到示例:http: //play.golang.org/p/NL6VXdHrjh 问题答案: 好吧,有什么特定的原因不使Proxy成为自己的结构? 无论如何,您有2个选择: 正确的方法是,只需将proxy移至其自己的结构,例如: 不太正确和丑陋的方法,但仍然有效:

  • 这是我的密码: 将按如下方式生成: 都很好。一切都被包装成标签。 现在我需要将这一行添加到上面的代码中: 下面是生成的代码: 但令人惊讶的是,它将被错误地生成: 看到没?元素跳出了标记。我怎么能把所有的东西都放在里面?

  • 问题内容: http://play.golang.org/p/f6ilWnWTjm 我正在尝试解码以下字符串,但仅获取空值。 如何在Go中解码嵌套的JSON结构? 我想将以下内容转换为地图数据结构。 问题答案: 在Go中使用嵌套结构来匹配JSON中的嵌套结构。 这是一个如何处理示例JSON的示例: 游乐场链接 您还可以对内部结构使用匿名类型: 游乐场链接 或外部和内部结构: 游乐场链接 如果您不知

  • 问题内容: 说我有以下数据结构 如何使用AngularJS在类似于以下的表格中呈现它: 按键是通过完成的。 问题答案: 如果您确实确实需要使用s进行处理,这是一种处理方法,除非您是作者(对不起),否则它很难完成并且几乎不可能阅读/关注,但是可以使用。您只需要夫妇的支持 像这样: 视图: