一个C++右值引用的问题
暂时先不更新前一篇文章了,感觉那个文章要写好久。累死。
今天说一说C++右值引用的一个问题。
这个问题的发现也是很偶然的。
来一段毫无意义但是能证明问题的代码:
std::string &&
get_string()
{
return "hello world";
} int main()
{
auto s1 = get_string();
auto const s2 = get_string();
auto const & s3 = get_string(); std::cout << s1 << std::endl;
std::cout << s2 << std::endl;
std::cout << s3 << std::endl; return ;
}
请问控制台输出神马?
自己跑一跑看一看,然后咱们下一个结论:
!!返回值不要搞成右值引用的样子!!
当然了,在这个简单的案例里面,你还能看到编译器报警。但是复杂的时候可能就看不到了。这个问题发生在我自己封装的访问optional::value()的函数里:
template <typename T>
T &&
value(optional<T> && v)
{
#if defined TKAT_APPLE_CLANG && TKAT_APPLE_CLANG <= 9020039
// https://stackoverflow.com/questions/44217316/how-do-i-use-stdoptional-in-c
return std::move(*std::move(v));
#else # if !defined NDEBUG
try
{
return std::move(v).value();
}
catch (std::bad_optional_access const & eh)
{
TKAT_LOG_TEST_ENVIRONMENT(eh.what());
throw;
}
# else
return std::move(v).value();
# endif #endif
}
完!
一个C++右值引用的问题的更多相关文章
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part8:Perfect Forwarding(完美转发):解决方案
本文为第八部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part4:强制Move语义
本文为第四部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/4220233.html. 强制Move语义 众所周知,正如C++标准的第一修正案所陈述:“委 ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part3:右值引用
本文为第三部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/4220233.html. 右值引用 如果x是任意类型,那么x&&则被称作一个 ...
- c++ 11 移动语义、std::move 左值、右值、将亡值、纯右值、右值引用
为什么要用移动语义 先看看下面的代码 // rvalue_reference.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #includ ...
- item 24: 区分右值引用和universal引用
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 古人曾说事情的真相会让你觉得很自在,但是在适当的情 ...
- C++11_ 右值引用
版权声明:本文为博主原创文章,未经博主允许不得转载. 由于右值所产生的临时变量问题一直是一种诟病,C++11中引入了右值引用这个核心语言机制,来提升运行期性能. 首先我先说明一下什么是左值和右值: 左 ...
- C11性能之道:右值引用
1.左值与右值 C++11中新增了一种类型,右值引用,标记为T &&. 首先来介绍什么是左值和右值,左值是指表达式结束后依旧存在的持久对象,而右值是指表达式结束之后就不再存在的临时对象 ...
- std::move的原理与实现,右值引用的深入理解
这次我真的懂了.... 首先C++11引入了右值引用 && ‘&&’这个要连起来看,是一个整体,C++多了一个关键字而已. 不是引用的引用.是船新的一种语法.那有什么用 ...
- 【C/C++开发】C++11:右值引用和转发型引用
右值引用 为了解决移动语义及完美转发问题,C++11标准引入了右值引用(rvalue reference)这一重要的新概念.右值引用采用T&&这一语法形式,比传统的引用T&(如 ...
随机推荐
- C语言--第2次作业
1.本章学习总结 1.1思维导图 1.2本章学习体会及本章代码量 1.2.1学习体会 不同于前几周简单的条件语句等,这一周开始学习循环结构for,while语句,甚至是多种语句嵌套使用,让我直接感受到 ...
- three.js初探,立体几何入手(一)
前言:首先先推荐一篇博客,关于webgl原理,讲的非常之通俗易懂了 图解WebGL&Three.js工作原理 webGL可以理解为openGL ES2.0 (webGL2.0 - openG ...
- Linux 搭建批量网络装机
- 【Axure RP8.1】一款专业的快速原型设计工具
Axure RP是一款专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写.Axure RP是美国Axur ...
- Git复习步骤
1.首先肯定是安装与配置了 首先要下载Git,然后设置用户名/邮箱 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...
- git命令合并分支代码
对于复杂的系统,我们可能要开好几个分支来开发,那么怎样使用git合并分支呢? 合并步骤:1.进入要合并的分支(如开发分支合并到master,则进入master目录)git checkout maste ...
- leetcode刷题——一些算法技巧总结1.0
运算符优先级,简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符 把数字取反,可以作为一种标记 pythonlast = ...
- SWUST OJ(1038)
顺序表中重复数据的删除 #include <iostream> #include <cstdlib> using namespace std; int main() { int ...
- 【Java】【12】精确的加减乘除运算
前言:用了BigDecimal对象 正文: 1,加法 /** * @param v1 被加数 * @param v2 加数 * @param scale 保留几位小数*/ public static ...
- 微信小程序----用户拒绝授权,重新调起授权
获取用户信息 wx.getUserInfo({ withCredentials: true, success: function (res) { var nickName = res.userInfo ...