加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C 11元组与复制省略或移动语义

发布时间:2020-12-16 07:12:56 所属栏目:百科 来源:网络整理
导读:我写了一个如下函数: template typename Tstd::tuplestd::vectorT,T,T f() { std::vectorT p(1000); return std::make_tuple(std::move(p),10,10);} 由于返回类型非常复杂,是否保证在c 11下编译器将在构造结果时应用复制省略或移动语义,或者我必须明确说出
我写了一个如下函数:

template <typename T>
std::tuple<std::vector<T>,T,T> f() {
    std::vector<T> p(1000);
    return std::make_tuple(std::move(p),10,10);
}

由于返回类型非常复杂,是否保证在c 11下编译器将在构造结果时应用复制省略或移动语义,或者我必须明确说出类似std :: move(std :: make_tuple(std: :move(p),10))?

解决方法

AFAIK复制省略始终是可选的.标准只是明确地说允许编译器进行这样的优化,因为它改变了可观察的行为,它没有强制要求它.特别是12.8 p. 31:

When certain criteria are met,an implementation is allowed to omit the copy/move construction of a class object,even if the constructor selected for the copy/move operation and/or the destructor for the object have side effects.

免责声明:这是来自社区草案n3690,但c 11的版本有不同的声明,如果不完全相同.

顺便说一下,标准就在那里指定.

但是,对于移动,它是有保证的.你创建一个临时对象并返回它(即std :: make_tuple返回一个右值并向前传递它),模板的参数不会改变对移动语义的支持.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读