C++ 用一个元素初始化向量是否需要复制构造函数?

C++ 用一个元素初始化向量是否需要复制构造函数?,c++,c++11,vector,move-constructor,C++,C++11,Vector,Move Constructor,下面的示例符合clang,但在GCC中失败 代码: #包括 结构Foo { Foo()=默认值; Foo(Foo&&)=默认值; }; Foo-baz(标准::矢量foos); Foo bar1(Foo&&Foo_) { std::vector foos{std::move(foo_)}; 返回baz(std::move(foos)); } Foo-bar2(Foo&&Foo_) { std::矢量foos; foos.push_back(标准::move(foo_)); 返回baz(std:

下面的示例符合clang,但在GCC中失败

代码:

#包括
结构Foo
{
Foo()=默认值;
Foo(Foo&&)=默认值;
};
Foo-baz(标准::矢量foos);
Foo bar1(Foo&&Foo_)
{
std::vector foos{std::move(foo_)};
返回baz(std::move(foos));
}
Foo-bar2(Foo&&Foo_)
{
std::矢量foos;
foos.push_back(标准::move(foo_));
返回baz(std::move(foos));
}
模板
Foo bar3(Foo&&Foo_,Foos&&Foos_)
{
std::vector foos{std::move(foo_),std::forward(foos_)…};
返回baz(std::move(foos));
}
虚设()
{
Foo-f1,f2;
bar3(标准移动(f1),标准移动(f2));
}
错误:

In file included from /opt/gcc-4.9.0/include/c++/4.9.0/vector:62:0,

from /tmp/gcc-explorer-compiler11512-1-c5m2m1/example.cpp:1:

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = Foo; _Args = {const Foo&}]':

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:75:53: required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const Foo*; _ForwardIterator = Foo*; bool _TrivialValueTypes = false]'

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:125:41: required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const Foo*; _ForwardIterator = Foo*]'

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:278:63: required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = const Foo*; _ForwardIterator = Foo*; _Tp = Foo]'

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_vector.h:1286:27: required from 'void std::vector<_Tp, _Alloc>::_M_range_initialize(_ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator = const Foo*; _Tp = Foo; _Alloc = std::allocator<Foo>]'

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_vector.h:378:36: required from 'std::vector<_Tp, _Alloc>::vector(std::initializer_list<_Tp>, const allocator_type&) [with _Tp = Foo; _Alloc = std::allocator<Foo>; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<Foo>]'

13 : required from here

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_construct.h:75:7: error: use of deleted function 'constexpr Foo::Foo(const Foo&)'

{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }

^

3 : note: 'constexpr Foo::Foo(const Foo&)' is implicitly declared as deleted because 'Foo' declares a move constructor or move assignment operator

struct Foo

^

Compilation failed
在/opt/gcc-4.9.0/include/c++/4.9.0/vector:62:0中包含的文件中,
来自/tmp/gcc-explorer-compiler11512-1-c5m2m1/example.cpp:1:
/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_-construct.h:void std::_-construct(_-T1*,_-Args&&&…[with _-T1=Foo;_-Args={const-Foo&}]的实例化:
/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:75:53:从“静态”转发迭代器std::_uninitialized_copy::_uninitialized_copy(_inputierator,_inputierator,_ForwardIterator)[带_inputierator=const Foo*;_ForwardIterator=Foo*;bool _tinalivaluetypes=false]
/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:125:41:从“_forwarditeratorstd::uninitialized_copy”(_InputIterator,_InputIterator,_ForwardIterator,_ForwardIterator)[带_InputIterator=const Foo*;_ForwardIterator=Foo*]中需要
/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:278:63:从“_forwarditeratorstd:::_uninitialized_copy_a”(_inputierator,_inputierator,_ForwardIterator,std::allocator&)[带_inputierator=const Foo*;_ForwardIterator=Foo*;_Tp=Foo])
/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_vector.h:1286:27:来自“void std::vector:::_M_range_initialize(_ForwardIterator,_ForwardIterator,std::forward_iterator_标记)[带_ForwardIterator=const Foo*;_Tp=Foo;_Alloc=std::alloctor]'
/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_vector.h:378:36:std::vector::vector(std::initializer_list,const allocator_type&)中的必填项[withTp=Foo;Alloc=std::allocator;std::vector::allocatortype=std::allocator]
13:从这里开始需要
/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_construct.h:75:7:错误:使用已删除的函数“constexpr Foo::Foo(const Foo&)”
{::新建(静态_-cast(u-p))_-T1(标准::转发(u-args));}
^
3:注意:“constexpr Foo::Foo(const Foo&)”隐式声明为已删除,因为“Foo”声明了移动构造函数或移动赋值运算符
结构Foo
^
编译失败

如果它是GCC中的一个bug,有人能为
bar3
函数提供一个简单的解决方法吗?

不可能从
初始值设定项列表中移出,因此
std::vector
的相应构造函数必须复制。这就是为什么你会犯错误<代码>bar2
应无错误地编译


重复调用
push_back
的常规模板包扩展技巧应该适用于可变版本。

我无法复制粘贴此处的代码
我无法访问您发布的站点。@balki,clang++没有在我的平台上编译:
。。。复制构造函数被隐式删除,因为“Foo”有一个用户声明的移动构造函数…
@Hamidi感谢您编辑此问题,除了所请求的解决方法外,这已在中介绍。它按其应该的方式失败。
In file included from /opt/gcc-4.9.0/include/c++/4.9.0/vector:62:0,

from /tmp/gcc-explorer-compiler11512-1-c5m2m1/example.cpp:1:

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = Foo; _Args = {const Foo&}]':

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:75:53: required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const Foo*; _ForwardIterator = Foo*; bool _TrivialValueTypes = false]'

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:125:41: required from '_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const Foo*; _ForwardIterator = Foo*]'

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_uninitialized.h:278:63: required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = const Foo*; _ForwardIterator = Foo*; _Tp = Foo]'

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_vector.h:1286:27: required from 'void std::vector<_Tp, _Alloc>::_M_range_initialize(_ForwardIterator, _ForwardIterator, std::forward_iterator_tag) [with _ForwardIterator = const Foo*; _Tp = Foo; _Alloc = std::allocator<Foo>]'

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_vector.h:378:36: required from 'std::vector<_Tp, _Alloc>::vector(std::initializer_list<_Tp>, const allocator_type&) [with _Tp = Foo; _Alloc = std::allocator<Foo>; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<Foo>]'

13 : required from here

/opt/gcc-4.9.0/include/c++/4.9.0/bits/stl_construct.h:75:7: error: use of deleted function 'constexpr Foo::Foo(const Foo&)'

{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }

^

3 : note: 'constexpr Foo::Foo(const Foo&)' is implicitly declared as deleted because 'Foo' declares a move constructor or move assignment operator

struct Foo

^

Compilation failed