- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想知道在调用 foo(string)
时是否进行了复制省略以下。(注:foo(string)
属于我无法更改的接口(interface))。
为此我尝试检查是否构造了 string("Hello world!")
是 rvalue
.
我搜索了如何以编程方式执行此操作并找到了这篇文章:How to determine programmatically if an expression is rvalue or lvalue in C++?
void foo( string str)
{
cout << str << endl;
}
int main()
{
foo("Hello world!");
cout << is_rvalue_reference<decltype(string("Hello world!"))>::value << endl;
}
结果是
Hello world!
0
我以为我会得到 true
至is_rvalue_reference< xxx >::value
string("Hello world!")
可能是 rvalue
但似乎不是“任何类型的引用”(lvalue
、rvalue
、通用 ...)所以我得到了 false
结果。有没有办法获得 true
回答 rvalue
?最佳答案
- Where am I wrong?
std::string("")
是一个右值,但 decltype(std::string(""))
不是一个右值引用。 std::string
对象的类型当然是... std::string
。
您有一个类别错误。右值是一种表达式,右值引用是一种类型。
临时 string
对象是一个右值。 string&&
类型是右值引用类型。
您的 decltype
表达式对于您正在尝试做的事情没有用处。考虑:
std::string s;
using type1 = decltype(s);
using type2 = decltype(std::string(""));
static_assert(std::is_same<type1, type2>::value, "same");
在这两种情况下,decltype
给出相同的类型:std::string
。这是因为 decltype
告诉您类型,而不是值类别(即表达式是右值还是左值)。
如果你想知道一个表达式是右值还是左值,你需要知道的不仅仅是它的类型。在 decltype(std::string(""))
的情况下,您正在创建一个未命名的临时对象,它是一个右值。你不需要问它的类型就知道了。
- string("Hello world!") may be a rvalue but does not seem to be a "reference of any kind" (either lvalue, rvalue, universal ... ) so that I got false result. Is there a way to get a true answer in case of a rvalue ?
你所说的“真实”答案是什么意思?你的意思是一个类型特征会给出结果 true
吗?
您可以询问该类型是否可转换为右值引用:
std::is_convertible<decltype(std::string("")), std::string&&>::value
这将告诉您是否可以将右值引用绑定(bind)到对象。但这是一个愚蠢的问题:当然,您可以将 X&& 类型的右值引用绑定(bind)到 X 类型的临时对象。您永远不需要问这个问题。
无论如何,你的函数不接受 string&&
类型的参数,所以问这个问题甚至不会告诉你关于你对 foo(std::string)< 的调用的任何信息
。
- Is there copy elision or not in his example ?
是的,从临时字符串初始化函数参数不应该进行任何复制或移动,它们应该被省略。 C++14 标准在 [class.copy] p31 中说,当临时对象(尚未绑定(bind)到引用)将被复制/移动到相同类型的类对象时,可以省略复制/移动。从相同类型的临时变量初始化类类型的函数参数时满足该条件。不执行该省略的编译器(至少在启用优化时,或在“发布”版本中)是一个糟糕的编译器。
在 http://en.cppreference.com/w/cpp/language/copy_elision 上有复制省略规则的解释。 -- 见关于无名临时工的部分。
关于c++ - 构造字符串 ("Plain Old C chain") 是右值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42066811/
文件 A 包含 hash:plain文件 B 包含用户名:hash需要的输出用户名:plain有什么办法可以在 shell 中做到这一点吗? 最佳答案 使用带有cut的命令替换: echo $(cut
我可以看到来自邮件服务器的许多 ehlo 命令回显,如下所示: 我想知道“250-AUTH LOGIN PLAIN”和“250-AUTH=LOGIN PLAIN”有什么区别?谢谢 最佳答案 它们的意思
我试图了解两者之间的区别: 一个“普通” elasticsearch查询,它将与术语查询匹配,并返回一定数量的匹配。 和一个过滤的查询(因此使用过滤器)将返回相同的匹配数。 这是术语查询: GET _
我正在开发一个可以接收文件 url 的应用程序,并且应该根据文件类型(音频、视频、图像)做不同的事情。所以我以这种方式获取文件的内容类型: URLConnection connection = url
Nodemailer 使用完全相同的配置正常工作了几个月。 var smtpTransport = nodemailer.createTransport({ service: "Zoho", auth
我使用的是来自非正统终端的gradle,因此Gradle的传统“漂亮”输出不起作用。 有什么方法可以在〜/ .gradle / gradle.properties中指定每个gradle命令都应使用--
在 Julia 中,你不能存储这样的字符串: str = "\mwe" 因为有一个反斜杠。因此,以下内容可以帮助您防止这种情况发生: str = "\\mwe" "$,\n" 和许多其他符号也会发生同
我需要将 data.frame 对象“转换”为纯文本(如 print 输出到控制台。 到目前为止,我创建了以下函数(使用 stringr 包),但我想知道是否存在已实现的函数或更有效的方法: toSt
在 Julia 中,你不能存储这样的字符串: str = "\mwe" 因为有一个反斜杠。因此,以下内容可以帮助您防止这种情况发生: str = "\\mwe" "$,\n" 和许多其他符号也会发生同
我正在编写一个登录面板来访问管理面板。数据(用户名和密码)存储在 MySQL 数据库(类型:InnoDB)中。在表中查看密码以纯文本形式存储,在字段密码中我有:{普通}密码。 调整我已有的代码时,我遇
我正在尝试使用类名 Plain Javascript 获取第一个子元素。 我正在尝试编写自己的表单验证并尝试附加错误消息并将其删除。如果错误消息已经存在,则不要追加。 如果您帮助我完成第一部分,为 c
问题:使元组的元组“简单”的最佳方法是什么?例如。一维。 案例 1 template auto process_field(Field&& field){ // or another std
我正在编写一个 Web 应用程序 API,当有人访问 URL 时,它会返回文本数据。我将内容类型设置为“文本/纯文本”,但是当我使用 Chrome 访问它时,它会下载一个包含信息的文件,而不是显示它。
我尝试将文本粘贴到多个字段中,但只清除了第一个元素的格式,而不是第二个元素等。 我发现了这个问题 https://stackoverflow.com/a/12028136/3955607这工作正常,但
我有一个查询,它使用聚合函数将值的 maximum absolute 分配给表中的另一列。问题是查询完成时间需要花费大量时间(大约加起来 10-15 秒)。这是查询的样子: UPDATE calcul
我在尝试使用 text/plain 时收到以下响应: { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.13", "
我想做的是- For Clients to Broker communication - use OAUTHBEARER authentication For Broker to Broker com
我了解 th:if 如何用于 html 模板,但是当您期望纯文本(用例:纯文本电子邮件模板)时,我没有找到有关如何执行此操作的任何线索。 到目前为止,我尝试过: Dear [[${contact
我有以下代码: NSURL *URL = [NSURL URLWithString:[@"some-address"]]; NSMutableURLRequest *request = [NSMuta
关闭。这个问题需要多问focused 。目前不接受答案。 已关闭10 年前。 已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 有人可以用简单的
我是一名优秀的程序员,十分优秀!