12得票1回答
重载决议:是否优先选择直接转换运算符(由于复制省略)?

给定 struct E { }; struct P { explicit P(E) {} }; struct L { operator E() {return {};} operator P() {return P{E{}};} }; 根据C++17语言标准,表达...

12得票2回答
不使用 std::move 如何按值返回 unique_ptr?

std::unique_ptr<int> ptr() { std::unique_ptr<int> p(new int(3)); return p; // Why doesn't this require explicit move using st...

12得票2回答
返回不可复制常量值的函数的非直观RVO?

考虑以下C++ >=17的示例代码: struct A{ A() = default; A(const A&) = delete; }; const A f(){ return A{}; } int main(){ const A& a = ...

11得票1回答
复制/移动省略需要明确定义复制/移动构造函数。

考虑以下程序: #include <iostream> #include <utility> class T { public: T() { printf("address at construction: %zx\n", (uintptr_t)thi...

11得票1回答
为什么即使有删除的复制构造函数,std::atomic也能在C++17中编译?

我有一个简单的代码:#include <atomic> int main() { std::atomic<int> a = 0; } 这段代码使用 -std=c++17 编译通过,但是使用 -std=c++14 和 -std=c++11 会编译失败。 使用已...

11得票3回答
按值传递导致额外的移动问题

我正在尝试理解移动语义和复制/移动省略。 我想要一个包装一些数据的类。我想在构造函数中传入数据并拥有该数据。 在阅读了这篇文章,这个论坛帖子和这个问题后,我得出的结论是,在C++11中,如果我想存储一份副本,则按值传递至少应该与任何其他选项一样有效(除了增加代码大小的小问题)。 然后,如...

11得票1回答
理解C++11中的rvalue、移动语义和性能

可能重复: 如果我返回文字而不是声明的std :: string会发生什么? 考虑以下代码:string getName () { return "meme"; } string name = getName(); 函数getName()返回一个临时对象。在C++03中...

11得票2回答
初始化列表中的复制构造函数

我正在探索std::intializer_list的丑陋世界。 据我从标准中了解到: § 11.6.4: 5.从初始化列表构造std :: initializer_list类型的对象,就像实现生成并实现了“N个const E数组”的prvalue一样,在这个数组的每个元素上都会进行复制初...

11得票2回答
为什么在 C++17 中的复制初始化需要析构函数,即使有保证的移动/复制省略?

以下代码在MSVC(/permissive-)下编译通过,但对于m_ptr1和m_ptr2在GCC / Clang下无法编译通过。#include <memory> struct ForwardDeclared; class A { public: ex...

11得票2回答
为什么使用std::tuple时不能保证复制省略?

我预期在C++20中,以下代码在打印A和B之间不会输出任何内容(因为我预期有保证的RVO会发生)。但实际输出为: A Bye B C Bye Bye 因此可以推断出一个临时对象被创建了。#include <iostream> #include <tuple> str...