列表初始化初始化的函数参数的默认值
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 错误。错误是什么?在我看来,当它用作函数参数并包含在另一种类型中时,它忘记实例化 class std::vector<int>
。
您可以通过在代码的其他地方使用 A 来解决它。即使是一个简单的声明就足够了。它强制编译器实例化模板化类型,你很好。在下面将编译的代码中寻找 A unused。
#include <vector>
struct A {
std::vector<int> vec;
};
void func (A &&a = {}) {
A unused;
}
int main()
{
func();
return 0;
}
谁能帮我解决以下问题?
有一个简单的代码:
#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 错误。错误是什么?在我看来,当它用作函数参数并包含在另一种类型中时,它忘记实例化 class std::vector<int>
。
您可以通过在代码的其他地方使用 A 来解决它。即使是一个简单的声明就足够了。它强制编译器实例化模板化类型,你很好。在下面将编译的代码中寻找 A unused。
#include <vector>
struct A {
std::vector<int> vec;
};
void func (A &&a = {}) {
A unused;
}
int main()
{
func();
return 0;
}