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

时间:2017-06-16 11:29:00

标签: c++ c++11 list-initialization aggregate-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;
}

我真的无法理解第一段代码的错误。

2 个答案:

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