#include <memory>
template <typename T>
class Wrapper {
public:
Wrapper() = delete;
Wrapper(const Wrapper&) = delete;
Wrapper(Wrapper&&) = delete;
~Wrapper() = default;
Wrapper(const T&) = delete;
Wrapper(T&& in) : instance{std::move(in)} {}
T instance;
};
void foo(Wrapper<std::shared_ptr<int>>) {}
int main() {
auto ptr = std::make_shared<int>(1);
foo(std::move(ptr));
}
这一直在 C++17 中工作,所以我从来没有想过,但为什么这段代码会尝试在 C++14 中调用移动构造函数?它不应该在函数参数中就地构造吗?这似乎不是 c++17 的问题,但不是用 c++14 编译的。
我看到的唯一解决方法是使foo
参数成为右值,但是我可以做些什么来使这项工作foo
在 C++14 中不使参数成为右值的情况下?
我的第一个想法是临时必须是构造函数才能传递给函数,但更令人惊讶的是,即使使用-fno-elide-constructors
和取消删除移动构造函数和复制构造函数,它们似乎也没有被调用!这是 gcc 和 clang 中的错误吗?
有关错误,请参阅https://wandbox.org/permlink/f6sa5Rm3NxZLy5P1并查看奇怪的行为https://wandbox.org/permlink/Kh6CG4OVbUAjvEZz