Supponiamo di avere una classe chiamata del prodotto, definita in questo modo:Quando è consentito al compilatore di ottimizzare l'inizializzazione di stile auto + brace?
class Product
{
public:
Product(const char *name, int i);
Product(Product &&rhs);
Product(const Product &rhs);
~Product();
private:
const char *m_name;
int m_i;
};
e si inizializza una variabile in questo modo:
auto p = Product{"abc",123};
ho pensato che la norma dettata che un compilatore deve logicamente effettuare le seguenti operazioni :
- costruire un prodotto temporanea
- mossa-costrutto p (usando il prodotto temporaneo)
Ma che al compilatore è stato permesso di ottimizzare questo modo che p sia costruito direttamente.
Ho verificato questo (Visual Studio 2013) e infatti, il compilatore lo ottimizza, anche se abbiamo il nostro costruttore di spostamento personalizzato (non predefinito). Questo va bene.
Tuttavia, se si elimina esplicitamente il copy-e Move-costruttore, in questo modo:
class Product
{
public:
Product(const char *name, int i);
Product(Product &&rhs) = delete;
Product(const Product &rhs) = delete;
~Product();
private:
const char *m_name;
int m_i;
};
L'inizializzazione auto + brace compila ancora. Ho pensato che il compilatore dovesse impedirlo perché non è consentito copiare o spostare.
abbastanza strano, se faccio il copy-eliminato e Move-costruttore privato, in questo modo:
class Product
{
public:
Product(const char *name, int i);
~Product();
private:
Product(Product &&rhs) = delete;
Product(const Product &rhs) = delete;
const char *m_name;
int m_i;
};
Poi l'inizializzazione auto + brace non compilatore più.
error C2248: 'Product::Product' : cannot access private member declared in class 'Product'
È questo comportamento previsto? Si tratta di un bug in Visual Studio 2013 (aggiornamento 3)?
Nota: Ho provato la compilazione di questo su ideone e ci si rifiuta infatti di compilare l'inizializzazione quando il copy-e Move-costruttori vengono eliminati (e pubblico). Quindi penso che questo sia un bug di Visual Studio.
Cordiali saluti in Visual Studio 2013 * * compilatore ha generato costruttori muovere e spostare gli operatori di assegnazione sono ** ** non supportate (se si può definire il proprio). [Ecco un elenco di conformità C++ 11 (non) di VS2013] (https://msdn.microsoft.com/en-us/library/hh567368.aspx#featurelist) – CoryKramer
Versione compilatore 18.00.30723. Potrebbe essere introdotto questo bug tra il 21005 e il 30723? – Patrick
@Patrick NVM. Una volta ho fornito parentesi vuote per il costruttore e il distruttore che ha compilato su VS. – NathanOliver