27得票3回答
我能否将一个不可移动和不可复制的函数结果拷贝到一个可选类型中?

我想在std::optional中存储一个不可移动且不可复制的非平凡类型,但该对象由自由函数构造。(示例)struct Foo { Foo(); Foo(Foo const&) = delete; Foo(Foo&&) = delete; ...

13得票3回答
编译器能够省略以下复制吗?

我还是一名新手程序员,我知道过早优化不好,但我也知道大量复制东西也不好。 我已经了解了关于复制省略及其同义词的内容,但是例如维基百科上的例子让我感觉只有在要返回的对象同时被完全构造时才会进行复制省略。 那么对于像向量这样的对象呢?通常情况下,只有填充了一些内容后,它们才有意义,作为返回值使用时...

10得票2回答
标准是否规定副本必须相等?

假设我有一种奇怪的字符串类型,它要么拥有其底层缓冲区,要么不拥有: class WeirdString { private: char* buffer; size_t length; size_t capacity; bool owns; public: ...

8得票1回答
为什么 for_each 返回一个移动函数?

我正在阅读这里的std::for_each文档http://en.cppreference.com/w/cpp/algorithm/for_each,发现返回值是std::move(f)。 标准为什么要强制在返回值中移动输入参数?既然输入参数是按值传递的,那么默认情况下它不会被移动吗? ...

7得票4回答
如何就地初始化数组?

如何初始化一个数组而不复制或移动构造临时元素?当元素具有明确的delete的复制或移动构造函数时,我只能在元素具有默认构造函数或具有所有默认参数的构造函数的情况下初始化数组,并执行以下操作之一:(a)简单声明数组,(b)直接初始化和零初始化数组,或(c)复制初始化和零初始化数组。既不是直接初始...

7得票1回答
在使用 co_await 时,对于不可复制和不可移动的类型出现了意外的 memcpy。

序言 这是我在代码中尝试做的事情的描述,请跳到下一节查看实际问题。 我想在嵌入式系统中使用协程,但不能承受太多的动态分配。因此,我尝试以下方法:为各种外设查询创建不可复制、不可移动的可等待类型。在查询外设时,我使用类似 auto result = co_await Awaitable{pa...

26得票2回答
复制省略与结构化绑定一起使用是否有效?

强制拷贝省略是否适用于通过结构化绑定进行的分解?它适用于以下哪些情况?// one auto [one, two] = std::array<SomeClass>{SomeClass{1}, SomeClass{2}}; // two auto [one, two] = std:...

9得票3回答
RVO在失败时强制编译错误

这里有很多关于何时可以执行RVO的讨论,但很少有关于实际执行RVO的内容。如先前所述,根据标准,无法保证RVO的执行,但是否有一种方法可以保证RVO优化成功或相应的代码无法编译? 到目前为止,我部分地成功地使代码在RVO失败时发出链接错误。为此,我声明了未定义的复制构造函数。显然,这既不健壮...

7得票4回答
是否可能确保复制省略?

复制省略是一种巧妙的优化技术,在某些情况下,依靠复制省略实际上比手动传递引用更快。 因此,假设您已经确定了一个关键代码路径,您依赖于编译器对代码路径执行复制省略以实现最大性能。 但现在您依赖于编译器优化。 是否有任何(特定于编译器的)方法可以确保实际执行复制省略,并让编译器(或其他工具)...

7得票1回答
为什么标准不强制要求实现RVO和NRVO?

为什么标准没有强制要求使用RVO和NRVO优化(当它们适用)?例如,一个函数通常会生成一些对象并将其作为结果返回。由于RVO/NRVO,复制/移动构造函数通常会被省略,但是它们仍然需要被定义,这有点令人困惑。如果RVO/NRVO被纳入标准,那么在这种情况下就不再需要复制/移动构造函数了。