ci potrebbe essere differenza in contesti che coinvolgono std::initializer_list<>
, ad esempio:
Caso 1-()
e {}
#include <initializer_list>
#include <iostream>
using namespace std;
struct Test2 {
Test2(initializer_list<int> l) {}
};
int main() {
Test2* test3 = new Test2(); // compile error: no default ctor
Test2* test4 = new Test2{}; // calls initializer_list ctor
}
Caso 2: (v)
e {v}
struct Value {
};
struct Test3 {
Test3(Value v) {}
Test3(initializer_list<Value> v) {}
};
int main() {
Value v;
Test3* test5 = new Test3(v); // calls Test3(Value)
Test3* test6 = new Test3{v}; // calls Test3(initializer_list<Value>)
}
Come affermato da Meyers e altri c'è anche una differenza enorme quando si utilizza STL:
using Vec = std::vector<int>;
Vec* v1 = new Vec(10); // vector of size 10 holding 10 zeroes
Vec* v2 = new Vec{10}; // vector of size 1 holding int 10
e non è limitato a solo
In questo caso non c'è alcuna differenza se (e initializer_list
ctor viene ignorato)
#include <initializer_list>
#include <iostream>
using namespace std;
struct Test {
Test() {}
Test(initializer_list<int> l) {}
};
int main() {
Test* test1 = new Test(); // calls default ctor
Test* test2 = new Test{}; // same, calls default ctor
}
C'è anche una differenza ben nota in questo caso
void f() {
Test test{};
Test test2();
}
dove test
è oggetto default-inizializzato di tipo Test
e test2
è una dichiarazione di funzione.
fonte
2015-05-03 12:20:06
Ho sistemato i problemi terminologici del tuo titolo. –