这是我的代码:
#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
答案 0 :(得分:3)
您没有为Bar::f
提供定义。因此,该对象的任何 odr-use 都将导致链接器错误。你接受它的引用就是那个。
隐式拷贝构造函数不算作 odr-use ,或者更可能是因为隐式拷贝构造函数完全由编译器发明并拥有,它更愿意优化副本,以便链接器不会诊断您的ODR违规。无论如何都不重要。