25得票4回答
按值传递参数的复制省略

鉴于struct Range{ Range(double from, double to) : from(from), to(to) {} double from; double to; }; struct Box{ Box(Range x, Range y)...

25得票4回答
Clang和GCC vs MSVC和ICC:如果复制/移动省略也可能适用,那么在复制/移动构造函数中是否需要使用static_assert来实现?

我的一个模板结构的移动构造函数中有一个 static_assert。即使可以进行拷贝省略,编译器是否需要考虑此 static_assert? 以下是简化后的情景:#include <type_traits> template<typename T> struct X...

23得票2回答
MSVC无法返回一个可复制但无法移动的对象

在尝试进行复制省略时,我遇到了这种奇怪的行为:class Obj { public: Obj() = default; Obj(Obj&&) = delete; Obj(const Obj&) { std::cout << "Cop...

22得票3回答
通过隐式转换返回时,是否需要拷贝构造函数?

下面的代码在Visual C++ 2013中可以编译通过,但是在GCC或Clang下不能。 哪个是正确的? 当通过隐式转换返回对象时,是否需要一个可访问的复制构造函数?class Noncopyable { Noncopyable(Noncopyable const &); ...

22得票2回答
GCC NRVO/RVO警告

在GCC中,有没有任何警告可以使我们知道是否执行了NRVO/RVO? 我发现-fno-elide-constructors会关闭NRVO/RVO,但NRVO/RVO有它自己的发生条件,有时候不会发生。为了理解额外的复制构造函数何时发生,需要知道NRVO/RVO是否发生。 我特别关注编译时特...

21得票3回答
为什么使用`make_x()`函数时移动构造函数不会被尽可能省略?

我无法理解为什么在最后一种情况下启用复制省略时(甚至是强制性的,例如在C++17中),为什么会调用移动构造函数: class X { public: X(int i) { std::clog << "converting\n"; } X(const X &am...

21得票2回答
使用工厂函数在原地初始化不可复制成员(或其他对象)

为了使任何这些语法合法,一个类必须拥有有效的复制或移动构造函数: C x = factory(); C y( factory() ); C z{ factory() }; 在C++03中,很常见依靠复制省略来防止编译器触碰复制构造函数。每个类都有一个有效的复制构造函数签名,无论是否存在定...

19得票3回答
使用 emplace() 创建对象时的复制省略

我在工作中看到很多人使用emplace和emplace_back来处理临时对象的代码,像这样:struct A { A::A(int, int); }; vector<A> v; vector<A>.emplace_back(A(1, 2)); 我知道empl...

18得票1回答
保证复制省略的行为是否依赖于用户定义的复制构造函数?

在GCC 8.0.1下,以下代码在有或没有自定义复制构造函数时表现不同: #include <cassert> struct S { int i; int *p; S() : i(0), p(&i) {} // S(const S &am...

18得票2回答
保证省略和链式函数调用

假设我有以下类型:struct X { X& operator+=(X const&); friend X operator+(X lhs, X const& rhs) { lhs += rhs; return lhs; ...