为什么默认复制构造函数可以接收未定义的静态成员变量?

时间:2017-01-07 17:18:15

标签: c++

这是我的代码:

#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

1 个答案:

答案 0 :(得分:3)

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

隐式拷贝构造函数不算作 odr-use ,或者更可能是因为隐式拷贝构造函数完全由编译器发明并拥有,它更愿意优化副本,以便链接器不会诊断您的ODR违规。无论如何都不重要。