4 ms·
Random emplace_back hate: I really dislike how you can't use it for objects that you'd normally use aggregate initialization for. See https://godbolt.org/z/6qW
by MauranKilom 6y ago
Random emplace_back hate: I really dislike how you can't use it for objects that you'd normally use aggregate initialization for.
See https://godbolt.org/z/6qW7q3 https://godbolt.org/z/6qW7q3
struct SimpleData
{
int a;
double b;
};
SimpleData someData = {1, 2.0}; // ok
std::vector<SimpleData> data;
// Why can I not do this?
data.emplace_back(1, 2.0);
- Koshkin 6y agoTo be fair, push_back won’t help you here, either.
- MauranKilom 6y agoIt does, actually. In fact, this is the most concise one (see godbolt link): data.push_back({1, 2.0}); That does not work with emplace_back (not that it would be useful) because the template arguments can't be deduced from the initializer list (whereas for push_back the type is known so you can initialize it with the initializer list).
- Koshkin 6y agoYou are correct, the problem is exclusively with emplace_back; incidentally, there is an "official" discussion of this at https://cplusplus.github.io/LWG/issue2089 https://cplusplus.github.io/LWG/issue2089.
- vinkelhake 6y agoYou can as of C++20 - aggregate initialization has been extended to support T(x, y) syntax. See https://godbolt.org/z/Tj5baM https://godbolt.org/z/Tj5baM and https://en.cppreference.com/w/cpp/language/aggregate_initialization https://en.cppreference.com/w/cpp/language/aggregate_initial... (case 5).
- gpderetta 6y agoThat's because of the epic fail that are initializer lists that prevent aggregate initialization (which is otherwise awesome) to be used safely in generic contextes.