gpt4 book ai didi

c++ - 为什么默认拷贝构造函数可以接收未定义的静态成员变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:10 24 4
gpt4 key购买 nike

这是我的代码:

#include <iostream>

class Foo {
public:
Foo() { std::cout << "Constructed" << std::endl; }
// Comment 1.
// Foo(const Foo& f) { std::cout << "Copy constructed." << std::endl; }
void Miao() { std::cout << "Miao" << std::endl; }
};

class Bar {
public:
static Foo f;
};

// Comment 2.
// Foo Bar::f;
Foo x(Bar::f);

int main() {
x.Miao();
return 0;
}

结果是:

Miao

如果我尝试重载 Foo 的复制构造函数(取消注释 Comment 1),则会发生编译错误:

/tmp/ccuF5B5q.o: In function `__static_initialization_and_destruction_0(int, int)':
default.cpp:(.text+0x51): undefined reference to `Bar::f'
collect2: error: ld returned 1 exit status

我的操作系统是ubuntu-14.04.5,g++版本是4.8.4。

我很困惑为什么这段代码运行良好?

提前致谢:p

最佳答案

您没有为 Bar::f 提供定义。因此,该对象的任何odr-use 都将导致链接器错误。你接受对它的引用算作。

要么隐式复制构造函数不算作odr-use,要么更有可能,因为隐式复制构造函数完全由编译器发明并归其所有,它更愿意优化复制,这样您的 ODR 违规就不会被链接器诊断出来。这两种方式都不重要。

关于c++ - 为什么默认拷贝构造函数可以接收未定义的静态成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41524239/

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