El siguiente código solo funciona cuando el constructor de copia está disponible.Copy Constructor Necesario con el objeto temporal
Cuando agrego declaraciones de impresión (a través de std::cout
) y hacer que el constructor de copia disponible no se utiliza (supongo que no hay truco tan compilador sucediendo para eliminar la copia innecesaria).
Pero tanto en la salida operator <<
y la función plop()
a continuación (donde se crea un objeto temporal) No veo la necesidad de que el constructor de copia. ¿Alguien puede explicar por qué el lenguaje lo necesita cuando estoy pasando todo por referencia constante (o lo que estoy haciendo mal).
#include <iostream>
class N
{
public:
N(int) {}
private:
N(N const&);
};
std::ostream& operator<<(std::ostream& str,N const& data)
{
return str << "N\n";
}
void plop(std::ostream& str,N const& data)
{
str << "N\n";
}
int main()
{
std::cout << N(1); // Needs copy constructor (line 25)
plop(std::cout,N(1)); // Needs copy constructor
N a(5);
std::cout << a;
plop(std::cout,a);
}
Compilador:
[Alpha:~/X] myork% g++ -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5646~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5646)[Alpha:~/X] myork% g++ t.cpp
t.cpp: In function ‘int main()’:
t.cpp:10: error: ‘N::N(const N&)’ is private
t.cpp:25: error: within this context
t.cpp:10: error: ‘N::N(const N&)’ is private
t.cpp:26: error: within this context
Ésta es una versión simplificada de algún código real.
En el código real, tengo una clase que contiene un std :: auto_ptr. Esto significa que un constructor de copia que toma una referencia constante no es válida (sin algo de trabajo) y yo estaba recibiendo un error que indica que el constructor de copia no estaba disponible debido a que:
cambiar la clase también:
class N
{
public:
N(int) {}
private:
std::auto_ptr<int> data;
};
El error es entonces:
t.cpp:25: error: no matching function for call to ‘N::N(N)’
¿qué compilador? Esto compila bien en VC9 – Naveen
N (N const &) debe ser N (const N &) –
@Captain: No realmente. Ambos son validos Prefiero el formulario que uso arriba. –