gpt4 book ai didi

C++ 为什么不能使用 constexpr 创建具有 const 引用成员变量的类?

转载 作者:行者123 更新时间:2023-12-04 11:50:14 25 4
gpt4 key购买 nike

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

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)提示:
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本身是代码中的 constexpr。我知道这可能与引用的生命周期有关,但我无法弄清楚逻辑。在这个例子的代码中,我不想存储 A 的拷贝,我真的只想要一个引用或(智能)指针。所以:
  • 为什么是 s1不是一个常量表达式?
  • 处理此问题的最佳实践方法是什么?

  • 非常感谢!

    最佳答案

    Clang 12.0.0+ gives a descriptive note about the issue :

    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这里:
    struct A {
    };

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

    A const & a;
    };

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

    关于C++ 为什么不能使用 constexpr 创建具有 const 引用成员变量的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67703646/

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