[英]Default value of function parameter initialized by list initialization
任何人都可以帮助我解决以下问题吗?
有一个简单的代码:
#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;
}
我真的不明白第一个代码有什么问题。
这是一个gcc bug 。 它也可以复制
template<typename Value>
struct A
{
A() = default;
std::vector<Value> m_content;
};
void func(A<int> a = {})
{
}
int main()
{
func();
}
目前,它没有任何地位。
我似乎缺少一个实际的向量实例导致编译器没有删除它的代码,导致未定义的引用。
正如@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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.