Anche se cambiamo questa opzione per utilizzare un lista di inizializzazione nel costruttore non riesce ancora:
#include <pthread.h>
struct foo {
pthread_mutex_t test;
foo() : test(PTHREAD_MUTEX_INITIALIZER) {}
};
int main() {
foo f;
}
possiamo vedere perché non riesce e un essere utilizzato solo per l'inizializzazione in pochi contesti, cercando in l'uscita dal pre-processsor:
struct foo {
pthread_mutex_t test;
foo() : test({ { 0, 0, 0, 0, 0, { 0 } } }) {}
};
non è legale per utilizzare le parentesi annidate per l'inizializzazione del genere in C++ 03, ma ciò che è più interessante forse è che C++ 11 rende questa sintassi e l'uso perfettamente legale .
Nel codice originale si può vedere un paio di cose:
A::A()
{
const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; // initialization - fine
mu = test; // assignment - fine
mu = PTHREAD_MUTEX_INITIALIZER; // assignment - C++11 only
}
Quello che spettacolo è un non assegnazione di inizializzazione. – Flexo
@Flexo, OOPS, spiacente. – Alcott
Non c'è bisogno di scusarsi! – Flexo