gpt4 book ai didi

c++ - 调用复制 ctor 而不是移动 ctor - 编译器可以发出警告吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:57 25 4
gpt4 key购买 nike

在下面的代码中,我想移动构造一个没有可用移动构造函数的对象:

class SomeClass{

public:
SomeClass() = default;

SomeClass(const SomeClass&) = default;
SomeClass( SomeClass&&) = delete;

};

SomeClass& getObject(){

return some_obj;

};

//...

SomeClass obj = std::move( getObject());

编译器给出错误:“使用已删除的函数”。这一切都很好。

另一方面,如果它有一个移动构造函数但 getObject() 返回一个 const 对象,那么将调用复制构造函数,即使我试图用 std::move 移动它也是如此。

是否可以让编译器给出一个警告/错误,即 std::move 不会有任何效果,因为对象不能被移动?

class SomeClass{

public:
SomeClass() = default;

SomeClass(const SomeClass&) = default;
SomeClass( SomeClass&&) = default;

};

const SomeClass& getObject(){

return some_obj;

};

//...

SomeClass obj = std::move( getObject());

最佳答案

如果您只是担心是否能获得最佳性能,那么大多数时候您应该只信任编译器。事实上,您几乎不需要使用 std::move()。例如,在您上面的示例中,它没有效果。现代编译器可以计算出何时应该发生移动。

如果您有应始终移动且永不复制的类,请删除它们的复制构造函数。

但也许您正在编写一个模板函数,如果您向它传递一个没有移动构造函数的类,它的性能会很糟糕,或者您处于我没有想到的其他情况。在这种情况下,std::is_move_constructible 可能就是您想要的。试试这个:

#include <type_traits>

#include <boost/serialization/static_warning.hpp>

template<class T>
T &&move_or_warn(T &t)
{
BOOST_STATIC_WARNING(std::is_move_constructible<T>::value);
return std::move(t);
}

现在,如果您执行 SomeClass obj = std::move_or_warn( getObject());,如果对象无法移动,您应该会收到编译器警告。 (尽管我可能会使用普通的 std::move 并单独调用 std::is_move_constructible。)

不幸的是,C++(目前)还没有一种标准方法来生成您正在寻找的那种程序员指定的警告,这就是我不得不使用 boost 的原因。看看here有关生成警告的更多讨论。

关于c++ - 调用复制 ctor 而不是移动 ctor - 编译器可以发出警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48885317/

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