相关疑难解决方法(0)

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

为什么我们可以在`const`对象上使用`std :: move`?

在C++ 11中,我们可以编写以下代码:

struct Cat {
   Cat(){}
};

const Cat cat;
std::move(cat); //this is valid in C++11
Run Code Online (Sandbox Code Playgroud)

当我打电话时std::move,这意味着我想移动对象,即我将改变对象.移动const对象是不合理的,为什么不std::move限制这种行为呢?这将是未来的陷阱,对吧?

陷阱意味着布兰登在评论中提到:

"我认为他的意思是"偷偷摸摸"他鬼鬼祟祟偷偷摸摸,因为如果他没有意识到,他最终得到的副本并不是他想要的."

在Scott Meyers的"Effective Modern C++"一书中,他给出了一个例子:

class Annotation {
public:
    explicit Annotation(const std::string text)
     : value(std::move(text)) //here we want to call string(string&&),
                              //but because text is const, 
                              //the return type of std::move(text) is const std::string&&
                              //so we actually called string(const string&)
                              //it is a bug which is very hard to find out
private:
    std::string value;
};
Run Code Online (Sandbox Code Playgroud)

如果 …

c++ c++11

96
推荐指数
3
解决办法
2万
查看次数

返回值还是右值参考?

在Scott Meyer的新书中,他提出了rvalue引用限定符的示例用法,如下所示:

class Widget {
private:
    DataType values;

public:
    DataType& data() &  { return values; } 
    DataType  data() && { return std::move(values); } // why DataType?
};
Run Code Online (Sandbox Code Playgroud)

以便:

auto values = makeWidget().data();
Run Code Online (Sandbox Code Playgroud)

移动构造values而不是复制构造它.

为什么rvalue-ref-qualified data()返回DataType而不是DataType&&?在这种情况下auto仍会推断DataType(虽然decltype(auto)不会 - 但这不是唯一的理由,更喜欢返回一个值而不是ravlue ref).这个高度投票的答案会返回一个rvalue ref,这对我来说在概念上更有意义.

c++ rvalue-reference c++11

12
推荐指数
1
解决办法
2415
查看次数

标签 统计

c++ ×3

c++11 ×3

rvalue-reference ×2