首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++为什么不能使用const引用成员变量创建类?

C++为什么不能使用const引用成员变量创建类?
EN

Stack Overflow用户
提问于 2021-05-26 11:06:16
回答 1查看 148关注 0票数 6

在下面的代码中,我尝试存储对另一个类的const引用:

代码语言:javascript
运行
复制
struct A {
};

struct B {
    constexpr B(A const & _a) : a(_a) {}
        
    A const &  a;
};

int main() {
    constexpr A s1;
    constexpr B s2{s1};
}

然而,编译器(gcc 11.1)抱怨:

代码语言:javascript
运行
复制
cctest.cpp: In function ‘int main()’:
cctest.cpp:12:22: error: ‘B{s1}’ is not a constant expression
   12 |     constexpr B s2{s1};
      |

我不明白为什么s1不是一个常量表达式。s1本身就是代码中的一个参数。我知道这可能与引用的生命周期有关,但我无法理解逻辑。在这个示例的代码中,我不想存储A的副本,我确实只想要一个引用或(智能)指针。所以:

  1. 为什么s1不是一个常量表达式?
  2. 处理这个问题的最佳做法是什么?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-26 11:12:24

Clang 12.0.0+对这一问题作了描述性说明

代码语言:javascript
运行
复制
note: address of non-static constexpr variable 's1' may differ on each invocation of the enclosing function; add 'static' to give it a constant address

因此,您需要在这里添加一个static

代码语言:javascript
运行
复制
struct A {
};

struct B {
    constexpr B(A const & _a) : a(_a) {}
        
    A const &  a;
};

int main() {
    constexpr static A s1;
    constexpr B s2{s1};
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67703646

复制
相关文章

相似问题

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