gpt4 book ai didi

c++ - 移动构造函数签名

转载 作者:可可西里 更新时间:2023-11-01 18:29:35 27 4
gpt4 key购买 nike

来自 this引用,它允许 const 右值作为移动构造函数

Type::Type( const Type&& other );

可移动对象如何成为const?即使这在技术上是允许的,在这种情况下这种声明是否有用?

最佳答案

How can a movable object be const?

它不能,但这不是语言所说的。该语言说具有该签名的构造函数是“移动构造函数”,但这并不意味着参数被移动,它只是意味着构造函数满足“移动构造函数”的要求。移动构造函数不需要移动任何东西,如果参数是 const 则不能。

is there a case where such declaration would be useful?

是的,但不是很频繁。如果您希望在将 const temporary 作为参数传递时防止通过重载决议选择另一个构造函数,它会很有用。

struct Type
{
template<typename T>
Type(T&&); // accepts anything

Type(const Type&) = default;
Type(Type&&) = default;
};

typedef const Type CType;

CType func();

Type t( func() ); // calls Type(T&&)

在这段代码中,func() 返回的临时值不会与复制或移动构造函数的参数完全匹配,因此将调用接受任何类型的模板构造函数。为防止这种情况,您可以提供一个不同的重载,采用 const 右值,并委托(delegate)给复制构造函数:

Type(const Type&& t) : Type(t) { }

或者如果你想阻止代码编译,将其定义为删除:

Type(const Type&& t) = delete;

参见 https://stackoverflow.com/a/4940642/981959有关标准中使用 const 右值引用的示例。

关于c++ - 移动构造函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14067539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com