相关疑难解决方法(0)

119
推荐指数
1
解决办法
6万
查看次数

为什么得到std :: tuple的帮助器返回rvalue引用而不是value

如果你看一下get辅助函数std::tuple,你会注意到以下的重载:

template< std::size_t I, class... Types >
constexpr std::tuple_element_t<I, tuple<Types...> >&&
get( tuple<Types...>&& t );
Run Code Online (Sandbox Code Playgroud)

换句话说,当输入元组本身是右值引用时,它返回一个右值引用.为什么不按值返回,调用move函数体?我的论点如下:get的返回将被绑定到引用,或者绑定到一个值(它可能被绑定到我想的任何东西,但这不应该是一个常见的用例).如果它与一个值绑定,那么移动构造无论如何都会发生.所以你不会因为价值回归而失去一切.如果绑定到引用,则返回右值引用实际上可能不安全.举个例子:

struct Hello {
  Hello() {
    std::cerr << "Constructed at : " << this << std::endl;
  }

  ~Hello() {
    std::cerr << "Destructed at : " << this << std::endl;
  }

  double m_double;
};

struct foo {
  Hello m_hello;
  Hello && get() && { return std::move(m_hello); }
};

int main() {
  const Hello & x = foo().get();
  std::cerr << x.m_double; …
Run Code Online (Sandbox Code Playgroud)

c++ stl move-semantics c++11

5
推荐指数
1
解决办法
694
查看次数

有没有办法正确地 std::move const 数据?

我的问题是我必须在复制常量数据和移动非常量数据之间做出选择,而且我从概念上看不出为什么在我的情况下将常量数据移动到常量目标是不安全的。我也知道从 const 对象移动是不合逻辑的 - 所以也许还有其他一些方法可以实现我正在尝试做的事情......

我有一个 Builder 类,它设置了一个我不想复制的 BigData 对象。构建器完成后,它会将数据“发出”为常量,因为在此之后不应对其进行修改。构建器是临时的,然后可以被丢弃,但数据应该继续存在,作为可以查询它的包装类中的 const 成员。builder 是一个泛型类型(不知道数据的细节),而 wrapper 是特定于数据内容的。这是通过数据中的类型擦除实现的,但这与此问题无关,只是要明确表示不希望合并构建器和包装器。

以下代码描述了上述内容,除非您删除 BigData 的移动构造函数,否则不会编译。编译错误表明这段代码会复制数据,这是不可取的:

prog.cpp:26:57: 错误:使用已删除的函数 'constexpr BigData::BigData(const BigData&)'
     包装器(const BigData&& In):数据(std::move(In)){}
                                                         ^
class BigData
{
    // Only a builder can create data
    friend class Builder;
    BigData() = default;
public:
    // Move only
    BigData( BigData&& ) = default;
};

class Builder
{
    BigData Data;
public:
    const BigData&& Build() & { return std::move(Data); }
    // Functions to set up data go here
};

class Wrapper
{
    const …
Run Code Online (Sandbox Code Playgroud)

c++ constants rvalue c++14

2
推荐指数
1
解决办法
100
查看次数

标签 统计

c++ ×3

c++11 ×2

c++14 ×1

constants ×1

move-semantics ×1

rvalue ×1

rvalue-reference ×1

stl ×1