以下代码:
using input_t = std::tuple<short,int&,const long&,const double>;
int b = 1;
int c = 2;
input_t t{0,b,c,3};
将无法在clang 9.0
中编译,但会以gcc 9.2
成功:https://godbolt.org/z/6CuEaf
clang
将失败,并显示以下错误:
In file included from <source>:2:
tuple:133:17: error: reference member '_M_head_impl' binds to a temporary object whose lifetime would be shorter than the lifetime of the constructed object
: _M_head_impl(std::forward<_UHead>(__h)) { }
^~~~~~~~~~~~~~~~~~~~~~~~~
/tuple:218:4: note: in instantiation of function template specialization 'std::_Head_base<2,const long &,false>::_Head_base<int &>' requested here
_Base(std::forward<_UHead>(__head)) { }
^
/tuple:217:4: note: in instantiation of function template specialization 'std::_Tuple_impl<2,const double>::_Tuple_impl<int &,int,void>' requested here
: _Inherited(std::forward<_UTail>(__tail)...),^
/tuple:217:4: note: in instantiation of function template specialization 'std::_Tuple_impl<1,int &,void>' requested here
/tuple:627:11: note: in instantiation of function template specialization 'std::_Tuple_impl<0,short,const double>::_Tuple_impl<int,void>' requested here
: _Inherited(std::forward<_UElements>(__elements)...) { }
^
<source>:10:13: note: in instantiation of function template specialization 'std::tuple<short,const double>::tuple<int,true>' requested here
input_t t{0,3};
^
下面哪个是正确的?我看不到会导致超过b
和c
生存期的任何事情。