with initialize argument c++ c++11 list-initialization aggregate-initialization

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.