列表初始化初始化的函数参数的默认值

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;
}