繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM