Подтвердить что ты не робот

Значение по умолчанию для параметра функции, инициализированного инициализацией списка

Может ли кто-нибудь помочь мне со следующей проблемой?

Существует простой код:

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

Я действительно не могу понять, что неправильно с первым кодом.

4b9b3361

Ответ 1

Это gcc bug. Он также может быть воспроизведен с помощью

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

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

int main()
{
    func();
}

В настоящее время статус на нем отсутствует.

Похоже, что отсутствие фактического экземпляра вектора приводит к тому, что компилятор не выделяет код для него, что приводит к ссылке undefined.

Ответ 2

Как упоминал @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;
}