作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include <iostream>
#include <typeinfo>
struct C {
explicit C() {std::cout << "constructor" << std::endl; }
C (const C&) { std::cout << "copyconstructor" << std::endl;}
~C() { std::cout << "destructor" << std::endl; }
};
int main(){
C c1;
auto f = [c1](){c1;};
std::cout << "leaving function scope" << std::endl;
return 0;
}
编译为
g++ -o a -std=c++11 test.cpp -fno-elide-constructors
生成输出:
构造器
复制构造函数
复制构造函数
析构函数
离开功能范围
析构函数
析构函数
编译
g++ -o a -std=c++11 test.cpp
生成输出:
构造器
复制构造函数
离开功能范围
析构函数
析构函数
由于我在第二次编译时跳过了-fno-elide-constructors
编译选项,为什么生成的代码还是调用了一次CopyConstructor?我建议 g++
编译器会自动使用复制省略来初始化 auto f
,就像它在初始化闭包时所做的那样,这会导致:
构造器
构造器
离开功能范围
析构函数
析构函数
最佳答案
I suggested that g++ compiler would automatically use copy elision for the initialization of auto f as it did for initializing the closure
但它没有使用复制省略来初始化闭包。您看到的唯一一个copyconstructor
是闭包变量的初始化。这是无法消除的。即使在 C++17 中;您将始终拥有 2 个 C 对象,一个从另一个复制。
如果您希望 lambda 仅引用外部作用域,那么您应该通过引用捕获变量:[&c1]
。按值(value)捕获意味着复制它。
关于c++ - 为什么使用 Lambdas/Closures 调用 CopyConstructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39964771/
#include #include struct C { explicit C() {std::cout << "constructor" << std::endl; } C (c
我是一名优秀的程序员,十分优秀!