gpt4 book ai didi

c++ - 使用静态成员初始化静态映射

转载 作者:太空狗 更新时间:2023-10-29 20:02:40 25 4
gpt4 key购买 nike

正在尝试初始化静态 map 。从其他问题我收集到它必须在头文件之外完成,并且在 c++11 中可以通过统一初始化完成。但是当我尝试使用另一个静态成员时,我遇到了问题:

foo.h:

#include <map>

class TestSuite {
static constexpr int x = 3;
static std::map<int, int> v;
};

foo.cpp:

#include "foo.h"

std::map<int, int> TestSuite::v = {{x, 5}};

int main() {
TestSuite t;
}

然后我得到错误

In function `__static_initialization_and_destruction_0(int, int)':
foo.cpp:(.text+0x4b): undefined reference to `TestSuite::x'
collect2: error: ld returned 1 exit status

最佳答案

我无法使用 GCC 6.1.0 重现此问题。但是,只要您尝试将引用绑定(bind)到您尚未定义的 constexpr 变量,它就可以重现,这可能是您的 std::map 构造函数所做的:

struct Foo {
static constexpr int i = 42;
};

int main() {
auto const &p = Foo::i; // undefined reference to `Foo::i'
}

这是因为绑定(bind)引用是一个 ODR-use i,这需要在链接时存在唯一定义。

在大多数此类情况下,有一个简单的解决方法,那就是应用一元 +:

struct Foo {
static constexpr int i = 42;
};

int main() {
auto const &p = +Foo::i; // OK!
}

应用 + 不会 ODR 使用 i,因为只需要它的值,而不需要它的标识。然后引用绑定(bind)到 + 返回的临时值,而不是 i

关于c++ - 使用静态成员初始化静态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37791387/

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