argument - c++ initialize class with parameters
Valor predeterminado del parámetro de función inicializado por inicialización de lista (2)
¿Podría alguien ayudarme con el siguiente problema?
Hay un código simple:
#include <vector>
struct A {
std::vector<int> vec;
};
void func (A &&a = {}) {}
int main()
{
func();
return 0;
}
Cuando intento compilarlo por gcc 5.4.0 me sale el error:
undefined reference to `std::vector<int, std::allocator<int> >::vector()''
Sorprendentemente, pero clang lo compila bien. También si para modificar un poco el código se compila sin ningún problema:
#include <vector>
struct A {
std::vector<int> vec;
};
void func (A &&a) {}
int main()
{
func({});
return 0;
}
Realmente no puedo entender lo que está mal con el primer código.
Como mencionó @NathanOliver, este es un error de GCC. ¿Cuál es el error? Me parece que se olvida de crear una instancia de una clase std::vector<int>
cuando se utiliza como un parámetro de función y se incluye en otro tipo.
Puede solucionarlo usando A en algún otro lugar del código. Incluso una simple declaración es suficiente. Obliga al compilador a crear una instancia del tipo de plantilla y tú eres bueno. Busque un no utilizado en el código siguiente que compilará.
#include <vector>
struct A {
std::vector<int> vec;
};
void func (A &&a = {}) {
A unused;
}
int main()
{
func();
return 0;
}
Este es un error gcc . También se puede reproducir con
template<typename Value>
struct A
{
A() = default;
std::vector<Value> m_content;
};
void func(A<int> a = {})
{
}
int main()
{
func();
}
Actualmente, sin embargo, no hay estado en él.
Parece que la falta de una instancia real del vector hace que el compilador no elimine el código, lo que conduce a la referencia indefinida.