19

谁能帮我解决以下问题?

有一个简单的代码:

#include <vector>

struct A {
    std::vector<int> vec;
};

void func (A &&a = {}) {}

int main()
{
    func();
    return 0;
}

当我尝试通过 gcc 5.4.0 编译它时,出现错误:

undefined reference to `std::vector<int, std::allocator<int> >::vector()'

令人惊讶的是,但是 clang 编译得很好。另外,如果稍微修改一下代码,它的编译不会有任何问题:

#include <vector>

struct A {
    std::vector<int> vec;
};

void func (A &&a) {}

int main()
{
    func({});
    return 0;
}

我真的不明白第一个代码有什么问题。

4

2 回答 2

11

这是一个gcc 错误。也可以用

template<typename Value>
struct A
{
    A() = default;
    std::vector<Value> m_content;
};

void func(A<int> a = {})
{
}

int main()
{
    func();
}

但目前,它没有任何状态。

我似乎缺少向量的实际实例导致编译器没有为它删除代码,这导致未定义的引用。

于 2017-06-16T12:29:50.753 回答
3

正如@NathanOliver 提到的,这是一个 GCC 错误。什么是错误?在我看来,std::vector<int>当它用作函数参数并包含在另一种类型中时,它忘记实例化一个类。
您可以通过在代码中的其他位置使用 A 来解决它。即使是一个简单的声明就足够了。它强制编译器实例化模板类型,你很好。在下面将编译的代码中查找未使用的 A。

#include <vector>

struct A {
    std::vector<int> vec;
};

void func (A &&a = {}) {
    A unused;
}

int main()
{
    func();
    return 0;
}
于 2017-06-16T13:03:26.480 回答