Il seguente codice funziona solo quando il costruttore di copie è disponibile.Copia Costruttore necessario con oggetto temporaneo
Quando aggiungo istruzioni di stampa (tramite std::cout
) e rende disponibile il costruttore di copie non viene utilizzato (presumo che si verifichi un tale accorgimento del compilatore per rimuovere la copia non necessaria).
Ma in entrambe l'uscita operator <<
e nella funzione plop()
di seguito (dove creo un oggetto temporaneo) non vedo la necessità del costruttore di copie. Qualcuno può spiegare perché il linguaggio ne ha bisogno quando sto passando tutto per riferimento const (o cosa sto facendo male).
#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);
}
Compiler:
[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
Questa è una versione semplificata del codice vero e proprio.
Nel codice reale ho una classe che contiene uno std :: auto_ptr. Ciò significa che un costruttore di copia che richiede un riferimento const non è valido (senza qualche lavoro) e mi è stato sempre un errore che indica che il costruttore di copia non era disponibile a causa di esso:
cambiare la classe troppo:
class N
{
public:
N(int) {}
private:
std::auto_ptr<int> data;
};
L'errore è quindi:
t.cpp:25: error: no matching function for call to ‘N::N(N)’
quale compilatore? Questo compila bene su VC9 – Naveen
N (N const &) dovrebbe essere N (const N &) –
@Captain: Non proprio. Entrambi sono validi. Preferisco il modulo che uso sopra. –