#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


生成输出:

constructorcopyconstructorcopyconstructordestructorleaving function scopedestructordestructor

编译

g++ -o a -std=c++11 test.cpp


产生输出:

constructorcopyconstructorleaving function scopedestructordestructor

由于我在第二次编译中跳过了-fno-elide-constructors编译器选项,为什么生成的代码仍然仍然调用CopyConstructor一次?我建议g++编译器将自动使用复制省略法来初始化auto f,就像初始化闭合一样,这将导致:

constructorconstrutorleaving function scopedestructordestructor

最佳答案

我建议g ++编译器将自动使用复制省略来初始化auto f,就像初始化关闭一样


但是它没有使用复制省略来初始化关闭。您看到的唯一的copyconstructor是闭包变量的初始化。那不能被消除。即使在C ++ 17中;您将始终有2个C对象,一个从另一个对象复制。

如果您希望lambda仅引用外部作用域,则应该已通过引用捕获变量:[&c1]。按值捕获意味着复制它。

08-17 00:26