64,646
社区成员
发帖
与我相关
我的任务
分享
// TEMPLATE FUNCTION forward
template<class _Ty> inline
_CONST_FUN _Ty&& forward(
typename remove_reference<_Ty>::type& _Arg) _NOEXCEPT
{ // forward an lvalue as either an lvalue or an rvalue
return (static_cast<_Ty&&>(_Arg));
}
template<class _Ty> inline
_CONST_FUN _Ty&& forward(
typename remove_reference<_Ty>::type&& _Arg) _NOEXCEPT
{ // forward an rvalue as an rvalue
static_assert(!is_lvalue_reference<_Ty>::value, "bad forward call");
return (static_cast<_Ty&&>(_Arg));
}
template <class T>
inline constexpr typename std::remove_reference<T>::type &delivers (T &&arg) {
return arg ;
}
int write (const char* str, int len)
{
return write(str,&len);
}
[/quote]
的确这算是未定义行为,但编译器应该在语句结束后才析构掉右值吧
本来我就一直用的delivers,但如果能使用库函数的变种就不用每次写delivers了[/quote]
是的,语言要求临时变量在完整表达式末尾逆序析构,问题是右值可能都不对应临时变量。
delivers 的那种写法,还不如简单封装一下呢,最起码写一次其他调用的地方看着都正常了。
int write (const char* str, int len)
{
return write(str,&len);
}
[/quote]
的确这算是未定义行为,但编译器应该在语句结束后才析构掉右值吧
本来我就一直用的delivers,但如果能使用库函数的变种就不用每次写delivers了
int write (const char* str, int len)
{
return write(str,&len);
}