gpt4 book ai didi

c++ - 为什么使用 Lambdas/Closures 调用 CopyConstructor?

转载 作者:行者123 更新时间:2023-11-28 05:28:55 24 4
gpt4 key购买 nike

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com