有人可以帮我解决以下问题吗?
有一个简单的代码:
#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;
}
我真的无法理解第一段代码的错误。
答案 0 :(得分:11)
这是gcc bug。它也可以用
复制template<typename Value>
struct A
{
A() = default;
std::vector<Value> m_content;
};
void func(A<int> a = {})
{
}
int main()
{
func();
}
目前,它没有任何状态。
我看来缺少一个实际的向量实例会导致编译器没有为它编出代码,导致未定义的引用。
答案 1 :(得分:3)
正如@NathanOliver所提到的,这是一个GCC错误。什么是虫子?在我看来,当它被用作函数参数并包含在另一种类型中时,它会忘记实例化一个类std::vector<int>
。
您可以通过在代码中的其他位置使用A来解决它。即使是简单的声明也足够了。它强制编译器实例化模板化类型,你很好。在下面的代码中查找将要编译的未使用的。
#include <vector>
struct A {
std::vector<int> vec;
};
void func (A &&a = {}) {
A unused;
}
int main()
{
func();
return 0;
}