也许有些东西我没有完全理解,但是在阅读了“自动使用decltype”之后
让我们假设我们有
int size(std::string &&s) { std::cout <<"std::string&&" <<std::endl; return s.size(); }
int size(const std::string &s) { std::cout <<"std::string const &" <<std::endl; return s.size(); }
我定义了两个lamba(一个带有auto,另一个正确转发auto)
auto f = [](auto x) { return size(x); };
std::string s{ "buonanotte" };
std::cout <<f(s) <<std::endl;
std::cout <<f("fiorellino") <<std::endl;
auto g = [](auto&& x) { return size(std::forward<decltype(x)>(x)); };
std::cout <<g(s) <<std::endl;
std::cout <<g("fiorellino") <<std::endl;
结果是一样的:f(s)和g(s)调用size(constd::string
我的问题是:为什么会发生这种情况?难道不应该只有第二个lambda能够区分左值和右值吗?我期望第一个lambda(f())调用两倍大小(const std::string)
我做错什么了吗?
好啊
所以我想发表一个完整的答案(迈克尔,再次感谢)。我感到困惑的是,“fiorellino”是一个右值,为它创建了一个临时对象,当一个常量T
我现在以这种方式更改了我的示例:
int size(std::string &&s) { std::cout <<"std::string&&" <<std::endl; return s.size(); }
int size(const std::string &s) { std::cout <<"std::string const &" <<std::endl; return s.size(); }
std::string generate(int x) { return std::to_string(x); }
auto f = [](auto x) { return size(x); };
std::string s{ "buonanotte" };
std::cout <<"f(): "; f(s);
std::cout <<"f(): "; f("fiorellino");
std::cout <<"f(): "; f(generate(123));
std::cout <<"f(): "; f(std::move(s));
auto g = [](auto&& x) { return size(std::forward<decltype(x)>(x)); };
std::string s2{ "buonanotte" };
std::cout <<"g(): "; g(s2);
std::cout <<"g(): "; g("fiorellino");
std::cout <<"g(): "; g(generate(123));
std::cout <<"g(): "; g(std::move(s2));
现在,generate(123)创建一个正确的临时值,该临时值将由第一个lambda错误转发,但由第二个lambda正确转发。
看看输出:
f(): std::string const &
f(): std::string&&
f(): std::string const &
f(): std::string const &
g(): std::string const &
g(): std::string&&
g(): std::string&&
g(): std::string&&
即使我使用d::移动(s)(它创建一个右值引用),第一个lambda总是选择const T
难道不应该只有第二个lambda能够区分左值和右值吗?我期待着第一个lambda(f())调用两倍大小(constd::字符串
字符串文字"fiorellino"
是一个左值,但是当将其传递给size
时,将从该字符串文字构造一个临时的std::字符串
对象,该临时是一个右值。
也就是说,f
中f("fiorellino")
的x
的类型将是const char*
。当f
调用size
时,该const char*
用于创建一个临时的std: string
(右值)。
这反过来导致右值重载被选择为f("fiorellino")
基于以下内容:"当用作函数参数时,当函数的两个重载可用时,一个取右值引用参数,另一个取左值引用对于const参数,右值绑定到右值引用重载"(源)。
我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方
我在http://www.nodebeginner.org上读了一篇教程,我在数据输出中有一个奇怪的行为。我知道,Stackoverflow也有类似的问题,但没有答案。所以我有这个Web-Server的代码: 调用RequestHandler.Upload的Router.js代码-我的buggy函数 和RequestHandler.Upload的代码 假设POST数据中有一个字符串。该函数的第一行
我正在编写一个DocumentFilter,它将输入JTextField的所有单词“top”替换为逻辑top符号。 使用此代码很好,但是它很烦人,因为用户必须重新键入他们的空间,他们可以这样做,并且文本继续在同一行上 当用户继续键入文本时,使用此代码并在空格中添加替换符会导致顶部符号和JTextField中的所有文本稍微向上推,然后转到下面并开始一行新的内容 有人能解释一下这种行为,并希望能提供一
我在做Maven项目。我用log4j做了一个日志。但它在给定的文件中显示了一些starnge日志。我试图理解,为什么会出现这种奇怪的日志,但我不明白。请帮助我,为什么这些不需要的行会进入日志文件。 请帮我把这个拿开。 log.properties 我通过阅读这个链接创建了这个文件。 代码是 日志txt-(log.txt的一些起始行)
使用方式如下: 这是有效的解决方案吗?如果删除未使用的“魔术”变量 - 我在返回字符串后有分割错误。做错了什么? $gcc--version gcc(Debian 4.4.5-8)4.4.5 $uname-Linux深度站(挤压)2.6.32-5-686#1 SMP 5月10日星期五08:33:48 UTC 2013 i686 GNU/Linux
问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么