当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [RESOLVED] c++ 匿名函式 capture 問題
帖子发表于 : 2012-04-10 22:00 
头像

注册: 2008-12-24 12:02
帖子: 108
送出感谢: 1
接收感谢: 4
代碼如下,在我 PC 上 執行
代码:
g++-4.7 -std=c++11 af.cpp -o af && ./af
或者
代码:
g++-4.6 -std=c++0x af.cpp -o af && ./af
輸出 8, 貌似不正確
將代碼中的「&」改爲「=」後 capture值後輸出貌似正確,爲 6.
請問這是正常情況麼?或是我搞錯它的用法了?
代码:
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    cout << [](int m) {
            return [&](int n) {
                return n + m;
            };
        } (2) (4)
        << endl;
    return 0;
}
 


_________________
機器生命


最后由 Kandu 编辑于 2012-04-11 21:49,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: c++ 匿名函式 capture 問題
帖子发表于 : 2012-04-11 20:34 
头像

注册: 2009-07-25 1:57
帖子: 701
送出感谢: 5
接收感谢: 13
你写的语义有问题阿。你的那个匿名函数先返回了一个函数对象,这个时候绑定的那个栈上局部变量m已经出栈销毁了,但编译器还是把那个引用解释为压入栈上的那个参数(这时候入栈的是n了)。所以最后 n+m = n+ (m引用的地址处的值) = n + n。改成[=] capture by value,则编译器留了一份副本。
[cpp]
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
auto f = [](int m){ return [&](int n){return n + m;};}; // 等效的 f 对象
cout << f(2)(4) << endl;
return 0;
}
[/cpp]


_________________
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。



_________________
评价: 3.7% Kandu
 
页首
 用户资料  
 
3 楼 
 文章标题 : Re: c++ 匿名函式 capture 問題
帖子发表于 : 2012-04-11 21:46 
头像

注册: 2008-12-24 12:02
帖子: 108
送出感谢: 1
接收感谢: 4
嗯,謝謝牛牛。


_________________
機器生命


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译