Следующий код:Почему emplace_back() не использует равномерную инициализацию?
#include <vector>
struct S
{
int x, y;
};
int main()
{
std::vector<S> v;
v.emplace_back(0, 0);
}
дает следующие ошибки при компиляции с GCC:
In file included from c++/4.7.0/i686-pc-linux-gnu/bits/c++allocator.h:34:0,
from c++/4.7.0/bits/allocator.h:48,
from c++/4.7.0/vector:62,
from test.cpp:1:
c++/4.7.0/ext/new_allocator.h: In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = S; _Args = {int, int}; _Tp = S]':
c++/4.7.0/bits/alloc_traits.h:265:4: required from 'static typename std::enable_if<std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::value, void>::type std::allocator_traits<_Alloc>::_S_construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = S; _Args = {int, int}; _Alloc = std::allocator<S>; typename std::enable_if<std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::value, void>::type = void]'
c++/4.7.0/bits/alloc_traits.h:402:4: required from 'static void std::allocator_traits<_Alloc>::construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = S; _Args = {int, int}; _Alloc = std::allocator<S>]'
c++/4.7.0/bits/vector.tcc:97:6: required from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {int, int}; _Tp = S; _Alloc = std::allocator<S>]'
test.cpp:11:24: required from here
c++/4.7.0/ext/new_allocator.h:110:4: error: new initializer expression list treated as compound expression [-fpermissive]
c++/4.7.0/ext/new_allocator.h:110:4: error: no matching function for call to 'S::S(int)'
c++/4.7.0/ext/new_allocator.h:110:4: note: candidates are:
test.cpp:3:8: note: S::S()
test.cpp:3:8: note: candidate expects 0 arguments, 1 provided
test.cpp:3:8: note: constexpr S::S(const S&)
test.cpp:3:8: note: no known conversion for argument 1 from 'int' to 'const S&'
test.cpp:3:8: note: constexpr S::S(S&&)
test.cpp:3:8: note: no known conversion for argument 1 from 'int' to 'S&&'
vector
Предложив использует синтаксис регулярного ()
конструктора для построения элемента из аргументов emplace_back()
. Почему вместо vector
использовать синтаксис унифицированной инициализации {}
, чтобы привести примеры, подобные описанным выше?
Мне кажется, что нечего терять, используя {}
(он вызывает конструктор, когда он есть, но все еще работает, когда его нет), и это было бы больше в духе C++ 11 использовать {}
- в конце концов, вся точка равномерная Инициализация заключается в том, что она используется равномерно - то есть везде - для инициализации объектов.
Можно было бы придумать тип языка supporrt для идеально передовых списков инициализации синтаксических фигурных скобок. Тогда можно просто сказать emplace_back ({a, b, ...}) –
@ JohannesSchaub-litb: IMHO, это больше похоже на то, что должно было быть 'std :: initializer_list'. Но простая модификация 'std :: allocator' должна исправлять все в порядке. – Potatoswatter
Что делать, если thevuser хочет сместить вектор с пользовательским распределением и записать emplace_back (1,2, alloc). Как это известно, чтобы передать его как ({1,2}, alloc)? imo, что раздатчик взлома разрывает вещь ecen больше. необходимо проработать надлежащее решение. –