首页 > TAG信息列表 > copy-elision

c – 如何强制执行复制省略,为什么它不适用于已删除的复制构造函数?

我有一个无法上课的课程.复制这将是有问题的.我想保证它不会被复制,所以我删除了它的复制构造函数: class A { public: A(); A(const A&) = delete; }; A fun() { return A(); }; int main() { A a = fun(); }; 不幸的是,g不会编译这个原因: t.cc: In function ‘

c – 在emplace()中创建对象时复制elision

我看到很多代码在工作中人们使用emplace和emplace_back与临时对象,如下所示: struct A { A::A(int, int); }; vector<A> v; vector<A>.emplace_back(A(1, 2)); 我知道emplace_back的重点是能够直接传递参数,如下所示: v.emplace_back(1, 2); 但不幸的是,一些人并不清楚这一

c – 自动和复制省略

当使用auto并提交到特定类型时,复制省略的规则究竟是什么? (见:GotW – Almost always auto). 根据我的理解,移动/复制构造函数必须是可访问的,即使它通常不被使用.但是接下来的例子中unique_ptr和fstream之间的区别是什么? (与noexcept有关吗?) #include <memory> #include <fstream>

c – 为什么以下代码也会调用复制构造函数?

为什么当g_Fun()执行返回temp时它会调用复制构造函数? class CExample { private: int a; public: CExample(int b) { a = b; } CExample(const CExample& C) { a = C.a; cout<<"copy"<<endl; } void Show () { cout<<a&l

C括号/复制省略括号中的return语句

我正在使用以下代码愚弄,并使用我的visual studio 2017应用程序和两个不同的在线编译器得到了不同的结果.在发布模式下,visual studio在两种情况下都会忽略复制/移动,而两个在线编译器只是在没有表达的返回语句的情况下执行此操作.我的问题是:谁是正确的,更重要的是什么是承保规则.

c – 是否应该保证复制省略?

我不明白gcc在这里的行为,我希望RVO可以应用,但不管我是否通过优化标志和/或我通过-std = c 17,在第二种情况下,无偿的一对括号似乎阻止了GCC从删除副本. $cat /tmp/foo.cc #include <iostream> #define PING() std::cerr << __PRETTY_FUNCTION__ << '\n' struct foo { foo() {

c – RAII和工厂设计模式?

假设我有Foo类: struct Resource { void block(); void unblock(); }; struct Foo { static Foo create() { Resource resource; resource.block(); return Foo{resource}; } ~Foo() { resource.unblock(); } void f() {} private: Resourc