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

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

我真的不明白第一个代码有什么问题。

最佳答案

这是 gcc bug .也可以用

复制
template<typename Value>
struct A
{
    A() = default;
    std::vector<Value> m_content;
};

void func(A<int> a = {})
{
}

int main()
{
    func();
}

不过,目前还没有任何状态。

我似乎缺少 vector 的实际实例导致编译器没有为它删除代码,从而导致 undefined reference 。

关于c++ - 列表初始化函数参数的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44588166/

相关文章:

c++ - 在 C++ 中实现增量数组

c++ - 有没有办法在不编写实际文件的情况下将 CString 发送到 CFile?

templates - 通过函数指针函数将lambda作为模板参数传递给模板

c++ - 从方法返回一个类会为类变量提供错误的值

c++ - 在 C++ 中初始化变量的正确方法是什么

c++ - 我的列表控件需要一个 while 循环

c++ - 寻找最小的产品

c++ - 包含它的模板化类型的 shared_ptr

c++ - 从 braced-init-list 初始化私有(private)聚合

c++ - 为什么不能从初始化列表初始化我的类,即使它是从 std::list 派生的?