Значение по умолчанию для параметра функции, инициализированного инициализацией списка
Может ли кто-нибудь помочь мне со следующей проблемой?
Существует простой код:
#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;
}
Я действительно не могу понять, что неправильно с первым кодом.
Ответы
Ответ 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;
}